我有一些奇怪的数据存储在5个字节中,我需要能够将其转换为int以便能够更容易地操作它。我有一些Python代码(提供给我的)已经这样做了,但我需要能够在Java中有一个解决方案。我认为我的问题是Python和Java在存储字节的方式上有所不同。将5个字节转换为整数
的Python(98%肯定这正常工作):
def bin5(b,k):
""" Returns binary integer from bytes k,k+1,...,k+4 in b."""
b0 = b[k ]
b1 = b[k+1]
b2 = b[k+2]
b3 = b[k+3]
b4 = b[k+4]
if b0<0: b0 += 256
if b1<0: b1 += 256
if b2<0: b2 += 256
if b3<0: b3 += 256
if b4<0: b4 += 256
return b0*65536.0+b1*256.0+b2+b3/256.0+b4/65536.0
Java的尝试:
// Returns binary integer from bytes k,k+1,...,k+4 in b.
private static int bin5(byte[] b, int k) {
byte b0 = b[k];
byte b1 = b[k + 1];
byte b2 = b[k + 2];
byte b3 = b[k + 3];
byte b4 = b[k + 4];
return (int)(b0 * 65536.0 + b1 * 256.0 + b2 + b3/256.0 + b4/65536.0);
}
我敢肯定,问题是在Java代码中的最后一个return语句。此外,它将适用于某些字节数组,但不适用于其他字节数组。我找不到这种行为的原因。
编辑:实施例: 如果Python代码读取字节:0 11 -72 0 0
为B0通B5尊称,它会改变-72
到184
,然后计算基于上述公式的值3000.0
。根据调查/数据参数,该值是正确的。
我的直觉说,Python代码故障一些值。一个这样的值是当它读取值0 -127 -66 0 0
(b0到b5恭敬地),其变为:0 129 190 0 0
然后通过转换输出值33214
。根据调查/数据参数,这是不可能的。但有可能这可能是一个错误的数据点。
编辑2: 0 13 9 0 0
应该返回3337(并在Python代码中)。但是在Java下,它返回3593.
Java中没有'byte'签名吗?如果是这样,你怎么能用'byte'来表示'b0'等等,因为它们的范围是从0到255。另外,你需要去掉那些'.0' - 分数可以加起来整数。 –
你看到什么问题? int也不会像你期待的那样有小数。并且字节被签名,并且您缺少上述的符号转换代码。 –
这似乎是返回一个浮点数,而不是一个int ... – fge