繁体   English   中英

java-从二进制文件中以2的补码形式读取2字节整数

[英]java - reading 2 byte integer in 2's complement from binary file into integer

我试图解析包含值的二进制文件。 在规范中,它表示每个值都以2的补码格式表示为2字节整数 我正在将文件读入称为“数据”的字节数组:

int i = (data[i] & 0xff) | (short) (data[i+1] << 8);

这些值看起来不错,但是当我尝试将它们写回到文件中时:

byte a = (byte)((tempInt >> 8) & 0xff);
byte b = (byte)(tempInt & 0xff);

'tempInt'是int的值。

当我读完所写的文件时,并非所有值都相同。 其中一些,但不是全部。

我在这里想念什么吗?

更新:我绘图比较的值。 上半部分是我从文件中读取的值。 下半部分是我从文件读取的值,然后将其写入新文件,然后再次读取。 情节 我认为这些图表看起来太相似了,以至于完全错误。

更新#2:我从输入文件中读取的字节:

0, 0, 59, 36, 40, 36, 23, 36, 54, 36, 54, 36, 41, 36, 46, 36, 50, 36, 52, 36, 79, 36, 79, 36, 66, 36, 65, 36, 58, 36, 58, 36, 58, 36, 45, 36, 51, 36, 65, 36, 65, 36, 76, 36, 78, 36, 69, 36, 54, 36, 68, 36, 86, 36, 85, 36, 81, 36, 81, 36, 80, 36, 84, 36, 84, 36, 80, 36, 82, 36, 85, 36, 81, 36, 80, 36, 75, 36, 75, 36, 79, 36, 91, 36, 83, 36, 64, 36, 71, 36, 79, 36, 56, 36, 38, 36, 47, 36, 51, 36, 41, 36, 48, 36, 63, 36, 56, 36, 50, 36, 57, 36, 67, 36, 78, 36, 81, 36, 67, 36, 81, 36, 81, 36, 82, 36, 69, 36, 66, 36, 66, 36, 54, 36, 39, 36, 78, 36, 78, 36, 78, 36, 62, 36, 57, 36, 73, 36, 75, 36, 69, 36, 76, 36, 81, 36, 74, 36

转换后的整数:

0, 9275, 9256, 9239, 9270, 9270, 9257, 9262, 9266, 9268, 9295, 9295, 9282, 9281, 9274, 9274, 9274, 9261, 9267, 9281, 9281, 9292, 9294, 9285, 9270, 9284, 9302, 9301, 9297, 9297, 9296, 9300, 9300, 9296, 9298, 9301, 9297, 9296, 9291, 9291, 9295, 9307, 9299, 9280, 9287, 9295, 9272, 9254, 9263, 9267, 9257, 9264, 9279, 9272, 9266, 9273, 9283, 9294, 9297, 9283, 9297, 9297, 9298, 9285, 9282, 9282, 9270, 9255, 9294, 9294, 9294, 9278, 9273, 9289, 9291, 9285, 9292, 9297, 9290

从上述值写入的文件中读取的字节数:

32, 0, 0, 36, 59, 36, 40, 36, 23, 36, 54, 36, 54, 36, 41, 36, 46, 36, 50, 36, 52, 36, 79, 36, 79, 36, 66, 36, 65, 36, 58, 36, 58, 36, 58, 36, 45, 36, 51, 36, 65, 36, 65, 36, 76, 36, 78, 36, 69, 36, 54, 36, 68, 36, 86, 36, 85, 36, 81, 36, 81, 36, 80, 36, 84, 36, 84, 36, 80, 36, 82, 36, 85, 36, 81, 36, 80, 36, 75, 36, 75, 36, 79, 36, 91, 36, 83, 36, 64, 36, 71, 36, 79, 36, 56, 36, 38, 36, 47, 36, 51, 36, 41, 36, 48, 36, 63, 36, 56, 36, 50, 36, 57, 36, 67, 36, 78, 36, 81, 36, 67, 36, 81, 36, 81, 36, 82, 36, 69, 36, 66, 36, 66, 36, 54, 36, 39, 36, 78, 36, 78, 36, 78, 36, 62, 36, 57, 36, 73, 36, 75, 36, 69, 36, 76, 36, 81, 36

转换后的整数:

32, 9216, 9275, 9256, 9239, 9270, 9270, 9257, 9262, 9266, 9268, 9295, 9295, 9282, 9281, 9274, 9274, 9274, 9261, 9267, 9281, 9281, 9292, 9294, 9285, 9270, 9284, 9302, 9301, 9297, 9297, 9296, 9300, 9300, 9296, 9298, 9301, 9297, 9296, 9291, 9291, 9295, 9307, 9299, 9280, 9287, 9295, 9272, 9254, 9263, 9267, 9257, 9264, 9279, 9272, 9266, 9273, 9283, 9294, 9297, 9283, 9297, 9297, 9298, 9285, 9282, 9282, 9270, 9255, 9294, 9294, 9294, 9278, 9273, 9289, 9291, 9285, 9292, 9297

更新#3:好的,所以我做了一个小版本的programm,我只是从文件中读取字节,将它们转换为整数,再将其转换回字节,然后将其写入文件。 没有完整的数据格式。 它确实有效。 因此,问题出在算法上,而不是字节到int(以及回到字节)的转换。 我将返回并检查算法。 谢谢您的帮助 :)

是的-您正在以Little-Endian格式读取它们(第一个值是最不重要的),但您是以Big-Endian格式写入它们(第一个值是最重要的),假设您正在写a然后b

编写文件时,只要颠倒顺序即可,假设文件应该是小端的:

byte a = (byte)(tempInt & 0xff);
byte b = (byte)((tempInt >> 8) & 0xff);

尝试这个:

int i = ((short)data[i] & 0xff) |  ((short)data[i+1] << 8);

由于databyte数组,因此data[i+1] << 8在8位上完成,得出零值。 我只是在shrt之前将值data[i+1]转换为shrt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM