Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java—写入int的第一个字节_Java_Int_Byte - Fatal编程技术网

Java—写入int的第一个字节

Java—写入int的第一个字节,java,int,byte,Java,Int,Byte,好的,所以我搜索了又搜索,什么都没找到。。。 我有一个int数组,每个int只占用低位字节。例如,我有 data[0] = Ox52 data[1] = Oxe4 data[2] = Ox18 data[3] = Oxcb 我希望标准输出正好包含这些字节(或者换句话说,如果我在文件中写入这些字节,并使用十六进制编辑器检查文件,我应该看到): 52e418cb 我该怎么做 感谢您的帮助在将它们写入文件/输出之前,只需将它们移到一起: (data[0] << 24) | (data[1

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

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

52e418cb

我该怎么做


感谢您的帮助

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

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

(数据[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                                    

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

因此:

将此负int值与OR运算符一起使用将导致错误的结果。因此,工作线如下所示:

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

((数据[0]&0xFF)为什么不使用
字节
数组?因为我正在尝试调整AES实现以供我个人使用,并且它使用int数组。我仍然无法使其工作,我有一个16 int的数组(因此,我应该得到16字节)最后我得到了24个字节>。所以你真正的问题是如何将二进制数据写入标准输出?@Sid A Java
int
始终是32位的,不管你在什么架构上。在任何情况下,这个概念都很容易扩展到64位。是的,但万一他们在某个时候用64位int编写虚拟机,我想这不太可能,但仍然可能是可行的使用大小运算符或其他方法计算移位量。@moooeeep:如果
int
中有其他垃圾,则会出现更大的问题:)但如果这确实是必要的,那就确定了。现在添加它会使它变得有点不必要的复杂。@Sid:no。已经有64位Java JVM了,但JSR指定int始终是32位,不管发生什么。@LouisWasserman point。顺便说一句,我喜欢这种方式,比接受答案abo中的输出流做得更好我认为这是肯定的。
((data[0] & 0xFF) << 24) | ((data[1] & 0xFF) << 16) | ((data[2] & 0xFF) << 8) | (data[3] & 0xFF)