【问题标题】:converting hexadecimal to byte in java在java中将十六进制转换为字节
【发布时间】:2012-12-01 03:12:18
【问题描述】:

我是 java 新手。我有一个逐行包含十六进制值的文本文档,我正在尝试读取它并将其转换为字节数组。但是对于像 8, d, 11, 0, e4 这样的十六进制值,在解析时我得到错误的 e4 值是 -28 而不是 228。 我怎样才能克服这个转换错误....

          FileInputStream fstream = new FileInputStream("C:/Users/data.txt");

          DataInputStream in = new DataInputStream(fstream);
          BufferedReader br = new BufferedReader(newInputStreamReader(in,"UTF-8"));


          byte[] bytes = new byte[1024];
          String str;
          int i=0;

          while ((str = br.readLine()) != null) 
          {

              bytes[i]= (byte) (Integer.parseInt(str,16) & 0xFF);
              i++;

          }
          byte[] destination = new byte[i];
          System.arraycopy(bytes, 0, destination, 0, i);

          br.close();
          return destination;

【问题讨论】:

标签: java parsing hex


【解决方案1】:

字节(和所有其他整数类型)在 Java 中是 signed,而不是 unsigned

如果您只是将字节视为字节数组,则某些值是否为负无关紧要,它们的位表示仍然正确。

您可以通过使用int0xff 屏蔽字节值来获得“正确的”无符号值,尽管结果值也将是int

int n = (myByte & 0xff);

【讨论】:

  • +1 但即使您将它们视为位并且不仅仅是调试,它仍然很重要。为什么哦为什么java已经签名...我不买这个解释:P
【解决方案2】:

正如Alnitak 所说byte 是用java 签名的。 0xe4的值=228,无符号,byte的范围是-128到127。

我的建议是使用int 而不是byte 之类的

int[] bytes = new int[1024];
bytes[i]= Integer.parseInt(str,16);

你得到你需要的东西。

【讨论】:

  • 很有可能他有充分的理由想要一个字节数组(即输入到其他一些 API 调用)。转换为 unsigned int 的唯一真正原因是为了表示目的,它应该与内部表示分开。
  • 还请注意,存储为 int 将需要四倍于将它们存储在 byte 数组中的内存...
猜你喜欢
  • 1970-01-01
  • 2014-03-11
  • 1970-01-01
  • 2014-03-10
  • 2013-09-12
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 2011-02-28
相关资源
最近更新 更多