好吧,所以我已经搜索和搜索,没有任何工作... 我有这个int数组,每个int只占用低位字节。举例来说,我有Java - 写一个int的第一个字节
data[0] = Ox52
data[1] = Oxe4
data[2] = Ox18
data[3] = Oxcb
我想要的标准输出中只包含那些字节(或者换句话说,如果我写这篇文章的一个文件,我检查用十六进制编辑器中的文件,我应该看到):
52e418cb
我该怎么做?
谢谢您的帮助
好吧,所以我已经搜索和搜索,没有任何工作... 我有这个int数组,每个int只占用低位字节。举例来说,我有Java - 写一个int的第一个字节
data[0] = Ox52
data[1] = Oxe4
data[2] = Ox18
data[3] = Oxcb
我想要的标准输出中只包含那些字节(或者换句话说,如果我写这篇文章的一个文件,我检查用十六进制编辑器中的文件,我应该看到):
52e418cb
我该怎么做?
谢谢您的帮助
下似乎很好地工作。我正在使用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
它确实有用,非常感谢! – Totor 2012-03-06 21:41:19
这样做的正确的方法是根据它们的期望的位置的字节数到移位和然后使用OR运算符拼接起来。但是,在移位之前,您还应该在字节的低8位执行位掩码。这是需要的,因为一个字节首先被转换为一个int(在转换完成之前)。这没什么大不了的,但是当最高位为1(即:该字节为负数)时,您的整数也会变为负数,这会导致所有前导位设置为1.
因此:
(byte) 10000000 = (int) 11111111 11111111 11111111 10000000
在OR运算符中使用负的int值会导致错误的结果。所以,工作线是这样的:
((data[0] & 0xFF) << 24) | ((data[1] & 0xFF) << 16) | ((data[2] & 0xFF) << 8) | (data[3] & 0xFF)
为什么不使用'byte'数组? – moooeeeep 2012-03-06 21:27:25
因为我正在尝试为我的个人使用调整AES实现,并且它使用int数组。我仍然无法使它工作,我有一个16 int(因此,我应该得到16个字节)的数组,因此最终得到24个字节。< – Totor 2012-03-06 21:38:50
所以你的实际问题是如何写入二进制数据到标准输出? – moooeeeep 2012-03-06 21:42:47