【问题标题】:how to get the binary values of the bytes stored in byte array如何获取存储在字节数组中的字节的二进制值
【发布时间】:2020-02-23 04:11:37
【问题描述】:

我正在做一个项目,该项目将文件中的数据放入字节数组中,并将“0”添加到该字节数组中,直到字节数组的长度为 224 位。我能够添加零,但我无法确认有多少零就足够了。所以我想以二进制格式打印字节数组中的文件数据。谁能帮帮我?

【问题讨论】:

  • 一个字节有多少位?回答这个问题可能会告诉您需要多少字节
  • 1个字节用8bits表示
  • 而你想要 224 位,那么你需要多少字节?

标签: java


【解决方案1】:

对于每个字节:

  • 转换为int(在下一步中通过将byte 自动扩展为int
  • 掩码为 255 的位与除最后 8 位以外的所有位都为零
  • 与 256 按位或将第 9 位设置为 1,使所有值的长度正好为 9 位
  • 调用Integer.toBinaryString() 生成一个9位字符串
  • 调用String#substring(1) 以“删除”前导“1”,仅保留8 个二进制字符(如果有前导零,则保持不变)

代码如下:

byte[] bytes = "\377\0\317\tabc".getBytes();
for (byte b : bytes) {
    System.out.println(Integer.toBinaryString(b & 255 | 256).substring(1));
}

上述代码的输出(总是 8 位宽):

11111111
00000000
11001111
00001001
01100001
01100010
01100011

【讨论】:

  • 这有时会为我打印七个字符。 This alternative answer 为我工作。
  • 使用这个:System.out.println(Integer.toBinaryString(0x100 + (int) (b & 0xFF)).substring(1)); 打印 8 个字符
  • @Duncan 有点晚了,但我修复了 7 字符的问题。关键变化是使用b & 255 | 256
【解决方案2】:

试试Integer.toString(bytevalue, 2)

好的,toBinaryString 来自哪里?还不如用那个。

【讨论】:

    【解决方案3】:

    您可以像下面的示例一样使用 BigInteger,尤其是如果您有 256 位 或更长。

    将你的数组放入一个字符串,然后从那里开始,参见下面的示例:

    String string = "10000010";
    BigInteger biStr = new BigInteger(string, 2);
    
    System.out.println("binary: " + biStr.toString(2));
    System.out.println("hex: " + biStr.toString(16));
    System.out.println("dec: " + biStr.toString(10));
    

    另一个接受字节的例子:

    String string = "The girl on the red dress.";
    
    byte[] byteString = string.getBytes(Charset.forName("UTF-8"));
    System.out.println("[Input String]: " + string);
    System.out.println("[Encoded String UTF-8]: " + byteString);
    
    BigInteger biStr = new BigInteger(byteString);
    System.out.println("binary: " + biStr.toString(2)); // binary
    System.out.println("hex: " + biStr.toString(16));   // hex or base 16
    System.out.println("dec: " + biStr.toString(10));  // this is base 10
    

    结果:

    [Input String]: The girl on the red dress.
    [Encoded String UTF-8]: [B@70dea4e
    
    binary: 101010001101000011001010010000001100111011010010111001001101100001000000110111101101110001000000111010001101000011001010010000001110010011001010110010000100000011001000111001001100101011100110111001100101110
    hex: 546865206769726c206f6e20746865207265642064726573732e
    

    您还可以将二进制转换为字节格式

    try {
       System.out.println("binary to byte: " + biStr.toString(2).getBytes("UTF-8"));
    } catch (UnsupportedEncodingException e) {e.printStackTrace();}
    

    注意: 对于二进制格式的字符串格式,您可以使用以下示例

    String.format("%256s", biStr.toString(2).replace(' ', '0'));  // this is for the 256 bit formatting
    

    【讨论】:

      【解决方案4】:

      先用0初始化字节数组:

      byte[] b = new byte[224];
      Arrays.fill(b, 0);
      

      现在只需用您的数据填充数组。任何剩余的字节都将为 0。

      【讨论】:

      • 如果文件的数据末尾实际上有零怎么办?您将无法分辨初始化零和实际零之间的区别
      • @bohemian,从文件中读取的数据零与普通零有何不同..he he :) 我不明白。
      • 您说“任何剩余的字节都将为 0”,但这不一定是真的 - 如果文件包含尾随零,按照您的逻辑,它似乎没有加载足够的数据,但它会
      猜你喜欢
      • 1970-01-01
      • 2019-09-06
      • 2011-08-07
      • 2013-09-29
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      相关资源
      最近更新 更多