【问题标题】:Java FileInputStream puts 3-4 bytes in same index of byte array?Java FileInputStream 将 3-4 个字节放在字节数组的相同索引中?
【发布时间】:2016-05-19 08:45:05
【问题描述】:

我不知道这是一个错误还是我在这里遗漏了什么。我正在尝试获取文件的确切字节,以便我可以处理一些。

所以我有一个 byte[1024] 数组来获取它的前 1024 个字节,一个 char[1024] 数组,我在每个字节上做一个 Integer.toBinaryString 来查看它的值

但在某些位置,而不是 8 位字节,存在诸如 index[20]=11111111111111111111111111111111 之类的值 指数[21]=1111111111111111111111111111110

一个字节怎么可能是 32 位?

在这种情况下,它应该是 UTF-16 BOM,根据我的测试它应该是 255 254 ,所以每个索引的最后 8 个应该在那里

提前感谢您的帮助

【问题讨论】:

    标签: java arrays byte fileinputstream


    【解决方案1】:

    字节和整数都用 Java 签名。

    负值存储为二进制补码。

    所以 -1 字节表示为 '1111 1111'。这将转换为 -1 int,表示为“1111 1111 1111 1111 1111 1111 1111 1111”,这就是您所看到的。

    如果您有一个字节 b 并希望查看其精确的逐位表示,您需要执行 ((int) b) & 0xFF

    这会将您的字节转换为 int,并将该新 int 的第一个字节“上方”的所有位重置为零。

    【讨论】:

    • 谢谢你的解释,我的程序正在运行
    【解决方案2】:

    您正在调用Integer.toBinaryString(),它采用int 参数。

    您传入的byte 会自动转换为intint 有 4 个字节,因此您得到的是 32 位。

    【讨论】:

    • 其余字节打印正常。但无论如何,有没有另一种方法可以简单地将字节复制为字符串?我想在文件上打印实际字节,例如“位置 i 上的 00000101”,而不是将其解码为其他任何内容
    • &0xFF 似乎可以工作。但是,可以肯定的是,如果我只做一个 println(byte[i]),并且控制台显示一个整数,它是否仍然假设它是一个像我一样的有符号整数上面的错误?我只是想确保 byte& 0xFF 正是文件的内容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 2011-09-16
    • 1970-01-01
    • 2016-06-10
    • 2016-04-07
    • 2015-01-11
    相关资源
    最近更新 更多