ruby包和十六进制值

ruby包和十六进制值,ruby,decoding,pack,hex,unpack,Ruby,Decoding,Pack,Hex,Unpack,一个半字节是四位。这意味着有16(2^4)个可能的值。这意味着一个半字节对应一个十六进制数字,因为十六进制是基数16。一个字节是2^8,因此可以用2个十六进制数字表示,然后是2个半字节 下面我有一个1字节的字符: “A” 该字符为2^8: 'A'.unpack('B*') => ["01000001"] 这意味着它应该由两个十六进制数字表示: 01000001 == 41 根据Ruby文档,对于数组方法包,当aTemplateString(参数)等于“H”时,它将返回一个十六进

一个半字节是四位。这意味着有16(2^4)个可能的值。这意味着一个半字节对应一个十六进制数字,因为十六进制是基数16。一个字节是2^8,因此可以用2个十六进制数字表示,然后是2个半字节

下面我有一个1字节的字符:

“A”

该字符为2^8:

 'A'.unpack('B*')
 => ["01000001"] 
这意味着它应该由两个十六进制数字表示:

 01000001 == 41
根据Ruby文档,对于数组方法包,当aTemplateString(参数)等于“H”时,它将返回一个十六进制字符串。但这是我得到的回报:

['A'].pack('H')
 => "\xA0" 
我的第一点是,这不是它应该返回的十六进制值。它应该返回十六进制值41。第二点是半字节的概念,正如我在上面解释的,这意味着对于1字节,它应该返回两个半字节。但在上面它插入了一个0,因为它认为输入只有一个半字节,即使“a”是一个字节,有两个半字节。很明显,我遗漏了一些东西。

我想你想要:

是否相反:

['41'].pack('H*') #=> "A"

这很棘手。[“1”].pack(“H”)=>“\x10”和[“16”].pack(“H”)=>“\x10”。我花了很长时间才明白这一点。

你在找
'A'.unpack('H*')#=>[“41”]
?@Stefan你有很高的代表性,所以你能添加tag
pack
unpack
吗?这是字符串类中的两个方法,我仍然无法理解:(@Stefan我想知道这个“\xA0”在哪里来自.A0不是“A”的十六进制值。它是什么?为什么当“A”是两个半字节时它要插入一个0?
['A'].pack('H')
创建一个十六进制代码
0xA0
超出ASCII范围的字符,就像
['41'].pack('H*)
用十六进制代码
0x41
创建一个字符,表示为
a
。是的,我看到它创建了十六进制A0。但是为什么它创建了A0而不是41?a的十六进制是41。A0来自哪里?它将输入值转换为十六进制:
“41”
转换为
0x41
“a”
在转换为
0xA0
时附加
0
,因为
H
首先表示高半字节。就像
[“4”]一样。pack(“H”)
转换为
0x40
,字符
@
['41'].pack('H*') #=> "A"