这个解压包在做什么?有人能帮我理解几个字母吗?
What is this unpack doing? Can someone help me understand just a few letters?
我正在阅读这段代码,我对发生了什么感到有点困惑。此代码使用 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
指令是这样的:
hex string (high nibble first)
encrypted_message中的转义字符是如何转化为字母和数字的?
我认为问题的核心是我不明白这一点。怎么回事?
['A'].pack('H')
=> "\xA0"
Here很好地解释了Ruby的打包和解包方法。
根据您的问题:
> ['A'].pack('H')
=> "\xA0"
一个字节由8位组成。一个 nibble 由 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 中的任何内容 table,因此最终输出保留原样,因此结果为 \xA0。前导 \x 表示该值为十六进制值。
我正在阅读这段代码,我对发生了什么感到有点困惑。此代码使用 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
指令是这样的:
hex string (high nibble first)
encrypted_message中的转义字符是如何转化为字母和数字的?
我认为问题的核心是我不明白这一点。怎么回事?
['A'].pack('H')
=> "\xA0"
Here很好地解释了Ruby的打包和解包方法。
根据您的问题:
> ['A'].pack('H')
=> "\xA0"
一个字节由8位组成。一个 nibble 由 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 中的任何内容 table,因此最终输出保留原样,因此结果为 \xA0。前导 \x 表示该值为十六进制值。