有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java写入int的第一个字节

好的,所以我搜索了又搜索,什么都没找到。。。 我有一个int数组,每个int只占用低位字节。例如,我有

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

我希望标准输出正好包含这些字节(或者换句话说,如果我在文件中写入这些字节,并使用十六进制编辑器检查文件,我应该看到):

52e418cb

我该怎么做

谢谢你的帮助


共 (3) 个答案

  1. # 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)
    
  2. # 2 楼答案

    下面的方法似乎很有效。我正在使用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                                    
    
  3. # 3 楼答案

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

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