在java中将十六进制转换为字节

时间:2012-12-13 09:02:47

标签: java parsing hex

我是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;

2 个答案:

答案 0 :(得分:5)

字节(以及所有其他整数类型)在Java中签名,而不是 unsigned

如果您只是将字节视为字节数组,那么某些值为负数并不重要,它们的位表示仍然正确。

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

int n = (myByte & 0xff);

答案 1 :(得分:1)

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

我的建议是使用int代替byte

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

你得到了同样的东西。