我有字符串,它总是十六进制的,如" FF"," BB"," AA"等等
我做了一个关于编码的小实验,看起来hexadecimal
占字节数的两倍,而不是字符串表示中的这些东西。
我的代码是这样的:
String hex ="FF";
byte[] b = hex.getBytes();
String enc = base16().encode(hex.getBytes());
byte[] c = enc.getBytes();
我正在使用Guava utils来编写代码。
hex
显示为两个字节,因此b
的长度为2。
然后我将其编码为十六进制。 " FF"十进制为255,因此需要1 byte
。但是enc
现在是4个字节,等于"4646"
。
接下来,c
为4个字节。
我不明白enc
生成的重点。我希望c
占用1个字节。有人会抛光吗?
谢谢!
答案 0 :(得分:2)
getBytes()
method并没有按照您的想法行事。它不会将其解析为十六进制数;它给出了字符编码。字符F
的编号为70
,因此hex.getBytes()
会为您提供'F', 'F'
或70, 70
的双字节数组。
使用平台的默认字符集将此String编码为字节序列,并将结果存储到新的字节数组中。
要将其解析为十六进制数字,您可以使用基数为16的Integer.parseInt
。
byte[] c = { (byte) Integer.parseInt(hex, 16) };
使用 Integer.parseInt
代替Byte.parseByte
,因为FF
对于有符号字节来说太大了。
输出:
[-1]
答案 1 :(得分:1)
使用Integer.parseInt(hex,16)
将十六进制字符串转换为int。然后你可以将它转换为字节。
当您调用hex.getBytes()
时,您将获得默认编码中两个F
个字符的字节表示形式。这通常需要每个字符至少一个字节,并且它不会将您的"FF"
字符串视为十六进制数字。