这是什么解包干什么? 有人可以帮助我了解只有几个字母?(What is this unpack

2019-10-29 08:47发布

我读这个代码,我很困惑,到底是怎么回事一点点。 该代码使用Ruby的OpenSSL库。

encrypted_message = cipher.update(address_string) + cipher.final
encrypted_message
=> "G\xCB\xE10prs\x1D\xA7\xD0\xB0\xCEmX\xDC@k\xDD\x8B\x8BB\xE1#!v\xF1\xDC\x19\xDD\xD0\xCA\xC9\x8B?B\xD4\xED\xA1\x83\x10\x1F\b\xF0A\xFEMBs'\xF3\xC7\xBC\x87\x9D_n\\z\xB7\xC1\xA5\xDA\xF4s \x99\\\xFD^\x85\x89s\e"
[3] pry(Encoder)> encrypted_message.unpack('H*')
=> ["47cbe1307072731da7d0b0ce6d58dc406bdd8b8b42e1232176f1dc19ddd0cac98b3f42d4eda183101f08f041fe4d427327f3c7bc879d5f6e5c7ab7c1a5daf47320995cfd5e8589731b"]

看来, H指令是这样的:

十六进制字符串(高半字节先)

在encrypted_message转义字符是如何转化成字母和数字?

我认为这个问题的心脏是,我不明白这一点。 到底是怎么回事?

['A'].pack('H')
=> "\xA0"

Answer 1:

这里是Ruby的包并解压方法的一个很好的解释。

根据你的问题:

> ['A'].pack('H')
=> "\xA0"

字节由8位组成。 半字节包括4个比特。 因此,一个字节有两个半字节。 的“H”的ASCII值是104 104十六进制值是68。这68存储在两个半字节。 第一半字节,这意味着4位,包含值6和第二半字节包含值8。一般来说,我们处理高半字节先,并从左至右我们挑选的值6,然后8。

另外,在上述情况下,输入“A”不是ASCII“A”,但六角“A”。 为什么是十六进制“A”。 这是十六进制“A”,因为指令“H”告诉包处理输入值的十六进制值。 由于“H”是高半字节先,自输入只有一个半字节那么这意味着该第二半字节是零。 所以输入从[ 'A']改变为[ 'A0']。

由于十六进制值A0并没有转化为在ASCII表中的任何最终的输出保持原样,因此结果是\ XA0。 领先的\ x表示值为十六进制值。



文章来源: What is this unpack doing? Can someone help me understand just a few letters?
标签: ruby unpack