我试图在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"
也许问题是我怎样才能以八进制而不是十六进制打印字节?在
30个八进制即
"\030"
与18个十六进制相同,即"\x18"
。它们都表示字节序列中的一个字节,十进制值为24。在您可以比较REPL中的精确值:
Check the Python documentation on string and byte literals:
\ooo
具有八进制值ooo的字符\xhh
具有十六进制值hh的字符它们既可以用于字节文字,也可以用于字符串(请记住,在python2中,字符串是字节序列)。在
默认情况下,
^{pr2}$bytes
不支持八进制表示(ascii编解码器始终使用十六进制),但您可以自己编写代码:请记住,字符串包含逐字引号和
b'
前缀,它可以接受转义斜杠作为十六进制序列。如果你真的想要一个好的八进制__repr__
最好的方法是创建一个循环并检查不可打印的字符,将它们转换为3位数的八进制并将所有内容连接到一个字符串中。在相关问题 更多 >
编程相关推荐