我正在读这段代码而且我对于发生了什么感到困惑。此代码使用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"
答案 0 :(得分:1)
Here是对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'告诉pack将输入值视为十六进制值。由于'H'首先是高半字节,并且因为输入只有一个半字节,所以这意味着第二个半字节为零。因此输入从['A']变为['A0']。
由于十六进制值A0不会转换为ASCII表中的任何内容,因此最终输出保留为原样,因此结果为\ xA0。前导\ x表示该值为十六进制值。