如何将此值转换为十六进制? (amf值)

How I can convert this value to hex? (amf value)

上下文: 我使用 python.

解码来自 flex 应用程序的 amf 响应

使用 pyamf 我可以解码所有响应,但有一个值引起了我的注意。

这个值\xa2C被转化为4419

#\xa2C -> 4419
#\xddI -> 11977 

我知道 \x 与十六进制值有关,但我无法获得将 4419 转换为 \xa2C 的函数。

4419是整数

--- 更新 1

这个原始值,不是十六进制。

因为我将这个值 \xa2I 转换为 4425.

那么\xa2I是什么值??? 谢谢!

-- 更新 2.

DJ = 5834
0F = 15
0G = error
1F = 31
a1f = 4294
adI = 5833
adg = 5863
adh = 5864

很奇怪有时在 F 之后接受值,而在其他情况下显示错误。但不是肯定的十六进制值。

您看到的是 AmfInteger 字节的字符串表示形式。第一个例子,\xa2C 由两个字节组成:0xa2 aka 162,和 C,这是 67 的 ASCII 表示:

>>> ord("\xa2C"[0])
162
>>> ord("\xa2C"[1])
67

要将其转换为 AmfInteger,我们必须遵循 AMF3 specifications,第 1.3.1 节(AmfInteger 的格式在 AMF0 和 AMF3 中是相同的,因此无论我们采用何种规格都无关紧要看看)。

在那一节中,U29(可变长度无符号 29 位整数,AmfIntegers 在内部使用它来表示值)被定义为 1、2、3 或 4 字节序列。每个字节编码有关值本身的信息,以及是否有另一个字节跟随。要弄清楚当前字节后面是否有另一个字节,只需要检查最高有效位是否已设置:

>>> (162 & 0x80) == 0x80
True
>>> (67 & 0x80) == 0x80
False

所以我们现在确认您看到的字节序列确实是一个完整的 U29:第一个字节设置了高位,表明它后面是另一个字节。第二个字节未设置位,表示序列结束。要从这些字节中获取实际值,我们现在只需要组合它们的值,同时屏蔽掉第一个字节的高位:

>>> 162 & 0x7f
34
>>> 34 << 7
4352
>>> 4352 | 67
4419

由此,应该很容易弄清楚为什么其他值会给出您观察到的结果。

为了完整起见,这里还有一个 Python 片段,其中包含一个解析 U29 的示例实现,包括所有极端情况:

def parse_u29(byte_sequence):
    value = 0
    # Handle the initial bytes
    for byte in byte_sequence[:-1]:
        # Ensure it has its high bit set.
        assert ord(byte) & 0x80

        # Extract the value and add it to the accumulator.
        value <<= 7
        value |= ord(byte) & 0x7F

    # Handle the last byte.
    value <<= 8 if len(byte_sequence) > 3 else 7
    value |= ord(byte_sequence[-1])

    # Handle sign.
    value = (value + 2**28) % 2**29 - 2**28

    return value


print parse_u29("\xa2C"), 4419
print parse_u29(map(chr, [0x88, 0x00])), 1024
print parse_u29(map(chr, [0xFF, 0xFF, 0x7E])), 0x1ffffe
print parse_u29(map(chr, [0x80, 0xC0, 0x80, 0x00])), 0x200000
print parse_u29(map(chr, [0xBF, 0xFF, 0xFF, 0xFE])), 0xffffffe
print parse_u29(map(chr, [0xC0, 0x80, 0x80, 0x01])), -268435455
print parse_u29(map(chr, [0xFF, 0xFF, 0xFF, 0x81])), -127