ruby包和十六进制值
一个半字节是四位。这意味着有16(2^4)个可能的值。这意味着一个半字节对应一个十六进制数字,因为十六进制是基数16。一个字节是2^8,因此可以用2个十六进制数字表示,然后是2个半字节 下面我有一个1字节的字符: “A” 该字符为2^8: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”时,它将返回一个十六进
'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你有很高的代表性,所以你能添加tagpack
和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"