【问题标题】:depythonifying 'char', got 'str' for pyobjcdepythonifying 'char',得到 pyobjc 的 'str'
【发布时间】:2021-10-31 12:48:12
【问题描述】:

0

故事是:我正在使用可以由 objc 框架自动控制的硬件,它已被许多同事使用,因此我可以将其视为“固定”库。但我想通过 Python 使用它,所以使用 pyobjc 我已经可以连接到这个设备,但无法向它发送数据。 header里面的objc命令是这样的

(BOOL) 执行abcCommand:(NSString*)commandabc

            withArgs:(uint32_t)args
             withData:(uint8_t*)data
          writeLength:(NSUInteger)writeLength
           readLength:(NSUInteger)readLength
  timeoutMilliseconds:(NSUInteger)timeoutMilliseconds
                error:(NSError **) error;

从我的 python 代码中,data 是一个参数,可以包含 256 字节的数据,例如 作为 0x00、0x01、0xFF。我的 python 代码如下所示:

senddata=Device.alloc().initWithCommunicationInterface_(tcpInterface)
            command = 'ABCw'
            args= 0x00
            writelength = 0x100
            readlength = 0x100
            data = '\x50\x40'
            timeout = 500
success, error = senddata.executeabcCommand_withArgs_withData_writeLength_readLength_timeoutMilliseconds_error_(command, args, data, writelength, readlength, timeout, None)

无论我发送什么,它总是显示。

ValueError: depythonifying 'char', got 'str'

我有点厌倦了挖掘,但找不到任何关于使用 pyobjc 将字符串或列表转换为 char 的信息

【问题讨论】:

  • 欢迎来到 Stack Overflow。我们只能告诉您您实际向我们展示的代码有什么问题。
  • 您需要展示更多 API 才能提供帮助。特别是,你必须告诉网桥这个指针是一个指向缓冲区的指针,如果没有看到更多,我无能为力。之后,“data”参数将是一个字节对象,而不是字符串。
  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: python objective-c pyobjc


【解决方案1】:

Objective-C 遵循适用于 C 的规则。
因此,在 objc 和 C 中,当我们查看 uint8_t* 时,它实际上与内存中的 char* 完全相同。 string 与此不同之处仅在于同意最后一个字符以\0 结尾,以表明我们称为字符串的char* 块有其上限。所以char* 块以\0 结尾,因为它是一个字符串。

在 C 中我们如何找出字符块的长度? 我们迭代整个块,直到找到\0。通常使用 while 循环,当你找到它时打破循环,如果你无论如何都没有给出它,你在循环内的计数器会告诉你你的长度。

您可以自行决定以所需格式解释数据。 这就是为什么有时更容易从 void* 强制转换或获取一个 char* 块,然后将其强制转换并声明为函数内部的 uint8_t 数据,如果它使用它。这是 C 语言的优点,能够根据您的意愿定义,使用赋予您的力量。

所以为了让你的生活更轻松,你可以像这样定义一个长度参数 -withData:(uint8_t*)data andLength:(uint64_t)len; 避免再次解析字符流,因为您已经知道它是/或应该是 256 个字符长。在 C 语言中,您要不惜一切代价避免的唯一事情是读取超出范围的索引尝试,引发 BAD_ACCESS 异常。

但是这些基本信息应该使您能够找到一种方法来声明您的 char* 块包含使用第一个指针 (*) 寻址的 uint8_t 数据,该指针还包含块的第一个 uint8_t 字符str 具有特定的长度 或直到\0 的首次出现。

旁注: 目标-c @"someNSString" == pythons u"pythonstring"

PS:在你的问题中不清楚是谁抛出了那个错误消息。 Python?因为它在接收时无法解释数据? pyobjc?因为当你和 objc 混合时它是 python 语法地狱? objc 运行时?因为它也遵循 C 的严格规则?

【讨论】:

  • 告诉更多,得到更好的答案。
  • 感谢详细解答。错误来自 Python,我正在尝试将 python 与用 objc 编写的框架一起使用。我已经从objc框架中导入了资源并能够建立连接,只是发送数据失败
猜你喜欢
  • 2018-01-01
  • 1970-01-01
  • 2011-04-21
  • 2015-10-06
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 2023-03-14
  • 2021-03-28
相关资源
最近更新 更多