我有一些奇怪的数据存储在5个字节中,我需要能够将它转换为int才能更容易地操作它。我有一些Python代码(提供给我)已经这样做了,但我需要能够有一个Java解决方案。我认为我的问题是现在Python和Java存储字节的方式不同。
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代码分别读取b0到b5的字节:0 11 -72 0 0
,它会将-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。
答案 0 :(得分:2)
你可以做到
private static double bin5(byte[] b, int k) {
int b0 = b[k] & 0xFF; // treat as unsigned byte
int b1 = b[k + 1] & 0xFF;
int b2 = b[k + 2] & 0xFF;
int b3 = b[k + 3] & 0xFF;
int b4 = b[k + 4] & 0xFF;
return (b0 * 65536 + b1 * 256 + b2 + b3 / 256.0 + b4 / 65536.0);
}
由于2的幂可以用double
精确表示,因此您不会得到任何舍入误差。
答案 1 :(得分:0)
这段代码很奇怪;它根本不会返回一个整数,而是浮动...
无论如何,Java等价的python代码是这样的(注意:没有边界检查完成完全):
private static double bin5(final byte[] b, final int k)
{
final ByteBuffer buf = ByteBuffer.allocate(8);
buf.position(3);
buf.put(b, k, 5);
buf.rewind();
final long l = buf.getLong();
return (double) l / 65536.0;
}
编辑:如果偏移k
处的字节数组的最后两个元素始终为0(它看起来像是),那么您可以从buf.rewind()
开始替换为:
buf.position(2);
return (double) buf.getInt();