这个解压包是做啥的?有人可以帮我理解几个字母吗?

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 码是什么?还是0prs 你昨天发布了"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 表示该值为十六进制值。

【讨论】:

以上是关于这个解压包是做啥的?有人可以帮我理解几个字母吗?的主要内容,如果未能解决你的问题,请参考以下文章

我是 python 新手,我偶然发现了一个函数/变量?我不知道它是做啥的,有人可以解释一下吗? [复制]

CSS:这个星号 (*) 是做啥的?

带有swdio字母的接口是做啥的?

numpy.exp() 到底是做啥的? [关闭]

glStencilMask() 到底是做啥的? [复制]

IT运维中的linux运维具体每天工作是做啥的?