Jos*_*sen 5 java mysql primitive protocol-buffers
我正在努力将一堆旧的以制表符分隔的MySQL数据库转储文件转换为协议缓冲区,并且遇到了麻烦.MySQL表包括类型的字段int(11) unsigned,这是我已映射到的Protobuf uint32中.proto的文件.在解析MySQL记录并尝试将它们转换为protobuf消息时,很有可能使用Integer.valueOf(String)(或Long.valueOf(String)避免溢出)来解析该字段.然而,Protocol Buffers的语言指南表明这里在Java中,uint32S使用的是代表的int数据类型,但与第一位被重新诠释为最高位,而不是作为符号位.
所以在我编写自己的String- > uint32-flavored- int解析器之前,我认为值得一问的是其他人是否已经解决了这个特殊问题.将Java String表示转换为Java中int unsigned的协议缓冲区的正确方法是什么uint32?
我会尝试解析为long然后转换为int:
int i = (int)Long.parseLong(str);
Run Code Online (Sandbox Code Playgroud)
用于long转换可以避免NumberFormatException由于超出范围而导致的错误。随后的缩小转换将删除结果位中较高有效的一半,从而准确地保留协议缓冲区所需的表示形式。
uint64使用的类似转换BigInteger可能会编写如下(未经测试的代码):
long l = (new BigInteger(str)).longValue();
Run Code Online (Sandbox Code Playgroud)
这依赖于隐式截断,就像上面的情况一样。文档指出:
如果该
BigInteger值太大而无法放入 long 中,则仅返回低位 64 位。
如果您想将int实际表示 an的 an 转换uint32为long带正号的 a,则应确保清除 32 个最高有效位,因为int由于符号,这些将填充该值的最高有效位的副本。扩大转换的延伸性质。
long uintValue = intValue & 0xffffffffL;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
684 次 |
| 最近记录: |