如何在java中转换长到字节数组?

时间:2016-08-10 08:39:52

标签: java type-conversion

我使用此代码

从字节数组中获取long
byte[] by = {07, 53 -70, 74};

long value = 0;

for (int i = 0; i < by.length; i++) {
    value =  ((value << 8) + (by[i] & 0xff));
}

System.out.println(value);

out put是520010

现在我想要对此进行逆向处理,我就这样试试了

long ts = 520010;

tm_stp[0] = (byte) ((byte) ts>>24);
tm_stp[1] = (byte) ((byte) ts>>16);
tm_stp[2] = (byte) ((byte) ts>>8);
tm_stp[3] = (byte) ts;
for (byte b : tm_stp) {
    System.out.println(b);
}

,输出为0 0 0 74

我的第二部分代码有什么问题请帮助我,谢谢!

2 个答案:

答案 0 :(得分:2)

问题在于你过早地投射到byte

tm_stp[0] = (byte) ((byte) ts>>24);
tm_stp[1] = (byte) ((byte) ts>>16);
tm_stp[2] = (byte) ((byte) ts>>8);
                   //^^^^

这会导致ts值被截断,用0替换前24个字节。之后,移动大于或等于8的任何内容将返回0。要避免使用负值的错误行为,还应使用位掩码。正确的代码应如下所示:

tm_stp[0] = (byte) ((ts >> 24) & 0xFF);
tm_stp[1] = (byte) ((ts >> 16) & 0xFF);
tm_stp[2] = (byte) ((ts >>  8) & 0xFF);
tm_stp[3] = (byte) ((ts >>  0) & 0xFF); // >> 0 not actually required, only for symmetry

答案 1 :(得分:1)

转换前不要将ts转换为byte

tm_stp[0] = (byte) (ts >> 24);
tm_stp[1] = (byte) (ts >> 16);
tm_stp[2] = (byte) (ts >> 8);
tm_stp[3] = (byte) ts;