2014-09-10 74 views
0

我有字符串,它总是十六进制,如“FF”,“BB”,“AA”等。 我做了一个编码东西的小实验,它看起来像hexadecimal是在字符串表示中将字节数加倍。十六进制表示占用比它应该更多的空间

我的代码是这样的:

 String hex ="FF"; 

     byte[] b = hex.getBytes(); 
     String enc = base16().encode(hex.getBytes()); 
     byte[] c = enc.getBytes(); 

我用番石榴utils的做编码的东西。

它看起来像是hex需要两个字节,所以b的长度为2. 然后我把它编码为十六进制。 “FF”是十进制的255,所以需要1 byte。但enc现在是4个字节,等于"4646"

接下来,c是4个字节。

我不明白enc正在生成的点。我想c需要1个字节。有人可以投射一些光线吗?

谢谢!

回答

2

getBytes() method不符合您的想法。它不会将其解析为十六进制数字;它给出了字符编码。字符F的编号为70,因此hex.getBytes()会为您提供一个'F', 'F'70, 70的双字节数组。

使用平台的默认字符集将此字符串编码为字节序列,并将结果存储到新的字节数组中。

解析它作为一个十六进制数,你可以使用Integer.parseInt以16

byte[] c = { (byte) Integer.parseInt(hex, 16) }; 

Integer.parseInt基数是用来代替Byte.parseByte因为FF是一个符号字节太大。

输出:

[-1] 
+0

这很有道理!谢谢你一下 – 2014-09-10 18:07:19

1

使用Integer.parseInt(hex,16)到十六进制字符串转换为int。然后你可以将它转换为字节。

当您拨打hex.getBytes()时,会得到默认编码中两个F字符的字节表示形式。通常每个字符至少需要一个字节,并且不会将您的"FF"字符串视为十六进制数字。

+0

嘿!谢谢! – 2014-09-10 18:04:51