如何将uint32转换成无符号字符数组?

2024-09-28 21:02:15 发布

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

我试图在python中将转换uint32_t值复制到unsigned char数组(我已经用C语言完成了)

这是我现有的C函数:

unsigned char *uint32_to_char_array(const uint32_t n)
{
    unsigned char *a;

    a = wrap_calloc(4, sizeof(unsigned char));

    a[0] = (n >> 24) & 0xff;  /* high-order (leftmost) byte: bits 24-31 */
    a[1] = (n >> 16) & 0xff;  /* next byte, counting from left: bits 16-23 */
    a[2] = (n >>  8) & 0xff;  /* next byte, bits 8-15 */
    a[3] = n         & 0xff;  /* low-order byte: bits 0-7 */

    return a;
}

如果我要在gdb中执行以下操作:

^{pr2}$

我正试图用python生成这个字符串。在

例如,对于uint32_t的输入值0x240918,我想要一个输出字符串"\000$\t\030"

我已经搜索过了,但是到目前为止还没有结果,特别是这个->;How to convert integer value to array of four bytes in python,但是似乎没有一个答案能够产生上面所述的输入/输出组合

我使用的是2.7版,但如果需要,可以使用3.0版。在

更新:

Python 3.5.2 (default, Nov 12 2018, 13:43:14) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 0x240918.to_bytes(4, "big")
b'\x00$\t\x18'

嗯,有点不同-我肯定答案就在眼前,但我看不出来是什么?在

所以我可以看到:

>>> b"\000$\t\030"
b'\x00$\t\x18'

但是怎样才能达到相反的效果呢?i、 e

>>> b'\x00$\t\x18'
b"\000$\t\030"

也许问题是我怎样才能以八进制而不是十六进制打印字节?在


Tags: to字符串答案bytesorderbytearray中将
1条回答
网友
1楼 · 发布于 2024-09-28 21:02:15

hmmm a bit different - i'm sure the answer is staring me in the face here but can't see what it is?

30个八进制即"\030"与18个十六进制相同,即"\x18"。它们都表示字节序列中的一个字节,十进制值为24。在

您可以比较REPL中的精确值:

bytes((0x00240918 >> i & 0xff) for i in (24,16,8,0)) == b"\000$\t\030"
True

Check the Python documentation on string and byte literals

  • \ooo具有八进制值ooo的字符
  • \xhh具有十六进制值hh的字符

它们既可以用于字节文字,也可以用于字符串(请记住,在python2中,字符串是字节序列)。在

默认情况下,bytes不支持八进制表示(ascii编解码器始终使用十六进制),但您可以自己编写代码:

^{pr2}$

请记住,字符串包含逐字引号和b'前缀,它可以接受转义斜杠作为十六进制序列。如果你真的想要一个好的八进制__repr__最好的方法是创建一个循环并检查不可打印的字符,将它们转换为3位数的八进制并将所有内容连接到一个字符串中。在

相关问题 更多 >