Java - 写一个int的第一个字节

时间:2012-03-06 21:20:54

标签: java int byte

好的,所以我搜索并搜索过,没有任何效果...... 我有这个int数组,每个int只占用低位字节。例如,我有

data[0] = Ox52
data[1] = Oxe4
data[2] = Ox18
data[3] = Oxcb

我希望标准输出包含那些字节(换句话说,如果我在文件中写这个并且我用Hex编辑器检查文件,我应该看到):

52e418cb

我该怎么做?

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

这样做的正确方法是根据所需位置移动字节,然后使用OR运算符将它们拼接在一起。但是,在移位之前,还应该在字节的低8位执行位掩码。这是必需的,因为首先将字节转换为int(在移位完成之前)。这没什么大不了的,但是当最高位为1时(即:字节为负),您的整数也将变为负数,这会导致所有前导位都设置为1。

所以:

(byte) 10000000 = (int) 11111111 11111111 11111111 10000000

将此负int值与OR运算符一起使用将导致错误的结果。所以,工作线就是这个:

((data[0] & 0xFF) << 24) | ((data[1] & 0xFF) << 16) | ((data[2] & 0xFF) << 8) | (data[3] & 0xFF)

答案 1 :(得分:0)

在将它们写入文件/输出之前,只需将它们移位并将它们组合在一起:

(data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]

答案 2 :(得分:0)

以下似乎工作正常。我正在使用OutputStream.write(int)方法。

int[] ints = new int[] { 0x52, 0xe4, 0x18, 0xcb };
FileOutputStream os = new FileOutputStream(new File("/tmp/x"));
for (int i : ints) {
    os.write(i);
}
os.close();

结果:

> hexdump /tmp/x
0000000 52 e4 18 cb