用Python打印C字符串

2024-09-30 06:25:30 发布

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

我想用Pythonprint语句打印一个C字符串。数组vendorName包含ASCIIZ C字符串A ANTHONY & SONS INC。我的动机是将C字符串转换为Python字符串,以便可以使用所有Python字符串方法。在

我有一个结构:

class _vendrRecord(Structure):
    _pack_ = 1                                            # pack the struct
    _fields_ = [
        ("vendorName"            ,c_ubyte *(40 + 1)),
        ("ytdPayments"           ,c_ulong),
        ]

我要打印字符串“vendorName”,它是ASCIIZ。在

我可以像这样使用printf打印它:

^{pr2}$

我试过这个print(vendrRecord.vendorName),但它只是打印地址。根据Jamie Nicholl Shelley提供的信息,我尝试了print(cast(vendrRecord.vendorName,c_char_p).value),但结果是{}。我只要A ANTHONY & SONS INC

请注意,print(vendrRecord.ytdPayments)打印正确。在


Tags: 方法字符串数组语句packanthonyinc动机
2条回答

您正在打印地址,因为这是您要求代码执行的操作。 您已经告诉它它是一个字符串类型,但没有在函数中声明为字符串,而是使用指向地址处数据的指针

与print()相比,print()是一个基于c++的函数

看起来你已经解决了大部分问题,只是对字符串编码感到困惑。您已成功到达bytes对象:

>>> v.vendorName
<__main__.c_ubyte_Array_41 object at 0xb0994a04>
>>> cast(v.vendorName, c_char_p)
c_char_p(176882328)
>>> cast(v.vendorName, c_char_p).value
b'A ANTHONY & SONS INC'

bytes对象是它听起来的样子,只是一个字节序列,它以字符串的方式显示只是为了方便用户。与字符串不同,每个组件都是一个整数:

^{pr2}$

但是,既然我们知道我们使用的是ascii,我们就可以将这个bytes对象解码为Python字符串,然后使用所有常用方法:

>>> s = cast(v.vendorName, c_char_p).value.decode("ascii")
>>> s
'A ANTHONY & SONS INC'
>>> type(s)
<class 'str'>
>>> s.lower()
'a anthony & sons inc'

相关问题 更多 >

    热门问题