【问题标题】:java - reading 2 byte integer in 2's complement from binary file into integerjava - 将二进制文件中2的补码中的2字节整数读取为整数
【发布时间】:2017-02-14 10:07:10
【问题描述】:

我正在尝试解析包含值的二进制文件。在规范中,它说每个值表示为 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: 好的,所以我制作了一个小版本的程序,我只是从文件中读取字节并将它们转换为整数,将它们转换回字节并将它们写入文件。没有完整的数据格式。 它确实奏效了。所以问题出在算法上,而不是字节到 int(以及返回到字节)的转换。 我会回去检查算法。 感谢您的帮助:)

【问题讨论】:

    标签: java int byte data-conversion bitmask


    【解决方案1】:

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

    在你写它们的时候把它们的顺序颠倒一下,假设文件是​​小端的:

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

    【讨论】:

    • 感谢您的回答 :) 我更改了顺序,但值仍然有些不同。我在更新中绘制比较值
    • @cmplx96:绘制这样的图表不如提供示例输入和输出 数字 有用,最好使用 minimal reproducible example。 (我们几乎不知道该图是如何真正生成的——除了“读取数字,写入数字”之外还有什么。)
    • 我添加了值。没有别的了。我读取文件,将其存储为整数,然后将其存储回字节。
    • @cmplx96:所以请展示执行此操作的代码。提供minimal reproducible example,以便我们自己尝试。我会仔细查看第一个字节,一方面...
    • @cmplx96:您所做的编辑与minimal reproducible example 相差甚远。一个最小的例子是只是读取值,然后将它们写回另一个文件。
    【解决方案2】:

    试试这个:

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

    由于databyte 的数组,因此data[i+1] &lt;&lt; 8 的值在8 位上完成,产生一个零值。我只是在左移之前将值data[i+1] 转换为shrt

    【讨论】:

    • &lt;&lt; 运算符将执行二进制数字提升,因此无论如何都不会对字节值进行移位。例如:byte b = 1; int x = b &lt;&lt; 8; System.out.println(x); 打印 256。
    猜你喜欢
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    相关资源
    最近更新 更多