十六进制表示占用比它应该更多的空间

时间:2014-09-10 17:53:58

标签: java encoding character-encoding hex byte

我有字符串,它总是十六进制的,如" 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个字节。有人会抛光吗?

谢谢!

2 个答案:

答案 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"字符串视为十六进制数字。