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

2024-04-29 02:32:48 发布

您现在位置:Python中文网/ 问答频道 /正文

上下文: 我用python解码flex应用程序的amf响应。在

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

此值\xa2C被转换为4419

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

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

4419是一个整数。在

---更新1

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

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

那么\xa2I是什么样的值??? 谢谢!在

--更新2。在

^{pr2}$

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


Tags: 函数应用程序错误情况整数解码flexamf
1条回答
网友
1楼 · 发布于 2024-04-29 02:32:48

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

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

要将其转换为AmfInteger,我们必须遵循AMF3 specifications,第1.3.1节(AmfInteger的格式在AMF0和AMF3中是相同的,所以我们看什么规范都无关紧要)。在

在该部分中,U29(可变长度无符号29位整数,amfinintegers在内部用来表示值)被定义为1、2、3或4字节序列。每个字节编码关于值本身的信息,以及后面是否有另一个字节。要想知道另一个字节是否在当前字节之后,只需检查是否设置了最高有效位:

^{pr2}$

现在我们看到的是,第一个字节的序列,是一个完整的字节序列。第二个字节的位未设置,表示序列结束。为了从这些字节中获得实际值,我们现在只需要合并它们的值,同时屏蔽掉第一个字节的高位:

>>> 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

相关问题 更多 >