这个解压包是做啥的?有人可以帮我理解几个字母吗?
Posted
技术标签:
【中文标题】这个解压包是做啥的?有人可以帮我理解几个字母吗?【英文标题】:What is this unpack doing? Can someone help me understand just a few letters?这个解压包是做什么的?有人可以帮我理解几个字母吗? 【发布时间】:2018-01-28 23:57:21 【问题描述】:我正在阅读这段代码,但我对发生了什么感到有点困惑。此代码使用 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"
【问题讨论】:
只是字符串的每个字节都是两位十六进制字符串,不是吗?G
的 ASCII 码是什么?还是0
、p
、r
或s
?
你昨天发布了"How does pack work in Ruby?",现在你问['A'].pack('H')
是如何工作的。我倾向于将此作为重复关闭...
你是怎么发现的?
【参考方案1】:
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”告诉包将输入值视为十六进制值。由于“H”首先是高半字节,并且由于输入只有一个半字节,因此这意味着第二个半字节为零。所以输入从 ['A'] 变为 ['A0'] 。
由于十六进制值 A0 不转换为 ASCII 表中的任何内容,因此最终输出保持不变,因此结果为 \xA0。前导 \x 表示该值为十六进制值。
【讨论】:
以上是关于这个解压包是做啥的?有人可以帮我理解几个字母吗?的主要内容,如果未能解决你的问题,请参考以下文章