cde*_*ker 13 java networking unsigned protocols
我正在尝试实现现有的网络协议,该协议大量使用Java不支持的无符号数据类型.我目前所做的是针对每种数据类型,选择下一个较大的数据类型,以便无符号数可以适合正区域,然后使用字节移位来获得所需的效果.由于这是非常容易出错的,并且对于无符号长的向前我必须使用比扩展类型重得多的BigInteger,我想知道是否有更好的方法来实现这一点?
Pet*_*rey 16
根据您的操作,您可以将long视为64位值,将int视为32位值.大多数操作esp readInt/Long writeInt/Long通过忽略符号来完成相同的操作.
你能给出一个你对这些数字进行操作的例子,也许我们可以建议如何在不扩展类型的情况下做同样的事情.
例如,++, - ,+, - ,*,==,!=,<<无论signess如何都是相同的(即给出相同的答案).对于>>你可以替换>>>
它是/,%,>,> =,<,<=和打印函数,它们假设有符号值,但您应该能够解决这些问题(如果您使用这些).
例如
long unsignedA =
long unsignedB =
boolean greater = unsignedA + Long.MIN_VALUE > unsignedB + Long.MIN_VALUE
Run Code Online (Sandbox Code Playgroud)
编辑:为什么这个工作?部分原因是java没有溢出/下溢异常.
例如
byte unsignedA = 0;
unsignedA--;
// unsignedA == FF, is this -1 or 255? Java assumes the former but you assume the later
byte unsignedB = unsignedA * unsignedA;
// unsignedB is -1 * -1 = 1 or (byte) (255*255) = (byte) 65525 = 1.
Run Code Online (Sandbox Code Playgroud)