2011-12-12 144 views
1

这可能是一个简单的问题,但我试图回顾编码和字节(我没有看过一会儿)来实现二进制协议。编码的十六进制字符串中的字节数

看起来正常字符是1个字节。但是,当你用十六进制编码它们时,它将字节数减半。

ruby-1.9.2-p180 :001 > "abcd".bytesize 
=> 4 
ruby-1.9.2-p180 :002 > ["abcd"].pack("H*") 
=> "\xAB\xCD" 
ruby-1.9.2-p180 :003 > ["abcd"].pack("H*").bytesize 
=> 2 

我也期待十六进制编码来与0-9和A-F

有人能帮助澄清这到底是怎么回事呢?而且,如果你能指出我对一般在线编码的好的评论,我很乐意提一提。我还没有看到任何简单的概述,但这会很棒。

谢谢!

+0

看来你确实解码而不是编码以十六进制为'十六进制abcd'(四个字节)是'171,205'(二字节)十进制。 –

+0

你想做什么?用十六进制表示每个字符的代码点? – deceze

+0

一个字符是一个字节。一个十六进制数字[0-9A-F]是一个低位或半个字节。例如,'FF'十六进制是一个字节的最大值。因此,你的发现是预料之中的:一个4字符的字符串是4个字节,而'ABCD'十六进制是两个字节,'AB'和'CD'。 –

回答

3

#pack读取给定的字符串并根据给定的格式将其转换为二进制。 pack('H*')表示您给出的字符串表示十六进制符号,因此它会将字节ABCD从十六进制转换为二进制(1010 1011 1100 1101),这是两个字节。

尝试["g"].pack("H*"),其中g不是有效的十六进制字符...

+0

我想我现在看到我的困惑 - “abcd”实际上是一个十六进制字符串,它将转换为二进制。我以为我正在采取一个正常的字符串,并将其转换为十六进制。 :/ 谢谢您的帮助! –

相关问题