2012-03-06 51 views
0

好吧,所以我已经搜索和搜索,没有任何工作... 我有这个int数组,每个int只占用低位字节。举例来说,我有Java - 写一个int的第一个字节

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

我想要的标准输出中只包含那些字节(或者换句话说,如果我写这篇文章的一个文件,我检查用十六进制编辑器中的文件,我应该看到):

52e418cb

我该怎么做?

谢谢您的帮助

+0

为什么不使用'byte'数组? – moooeeeep 2012-03-06 21:27:25

+0

因为我正在尝试为我的个人使用调整AES实现,并且它使用int数组。我仍然无法使它工作,我有一个16 int(因此,我应该得到16个字节)的数组,因此最终得到24个字节。< – Totor 2012-03-06 21:38:50

+0

所以你的实际问题是如何写入二进制数据到标准输出? – moooeeeep 2012-03-06 21:42:47

回答

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          
+0

它确实有用,非常感谢! – Totor 2012-03-06 21:41:19

0

只是转移和在一起,或者他们将其写入到文件/输出前:

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

该解决方案是否也适用于64位体系结构? – Sid 2012-03-06 21:26:29

+1

你应该添加一些'&0xff'掩码。以防万一...... – moooeeeep 2012-03-06 21:26:36

+4

@Sid无论您在哪种架构下,Java int都始终为32位。无论如何,这个概念很容易扩展到64位。 – Taymon 2012-03-06 21:27:41

1

这样做的正确的方法是根据它们的期望的位置的字节数到移位和然后使用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)