我是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;
答案 0 :(得分:5)
字节(以及所有其他整数类型)在Java中签名,而不是 unsigned 。
如果您只是将字节视为字节数组,那么某些值为负数并不重要,它们的位表示仍然正确。
您可以通过使用int
值0xff
屏蔽字节值来获取“正确的”无符号值,但结果值也将为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);
你得到了同样的东西。