对"char"进行解码,为pyobjc 'str'



0

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

(BOOL) executeabcCommand:(NSString*)commandabc

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

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

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

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

ValueError:解蟒化"char",得到"str">

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

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

我们在 C 中做什么来找出字符块的长度? 我们迭代整个块,直到找到。通常有一个while循环,当你找到它时会中断循环,如果你没有以某种方式给出它,循环内的计数器会告诉你你的长度。

由您以所需的格式解释数据。 这就是为什么有时更容易从 void* 转换或确实获取一个 char* 块,然后将其转换为函数中的uint8_t数据并声明为函数内部的数据,该函数使用 if 它。这是C语言的优点,能够按照你的意愿定义它,使用赋予你的力。

因此,为了让您的生活更轻松,您可以定义一个长度参数,如下所示-withData:(uint8_t*)data andLength:(uint64_t)len;避免再次解析字符流,因为您已经知道它的长度为 256 个字符。在 C 语言中,您唯一要不惜一切代价避免的是对超出界限的索引进行读取尝试,从而引发BAD_ACCESS异常。

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

。旁注: Objective-c@"someNSString"== pythonsu"pythonstring"

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

Python 一直非常宽容地将一种类型硬塞进另一种类型,但 python3 默认使用 Unicode 字符串,在插入 pyobjc 方法之前需要将其转换为二进制字符串。

尝试将字符串指定为字节对象为b'this'

我在尝试使用 IOKit 时遇到了同样的错误:

import objc
from Foundation import NSBundle
IOKit = NSBundle.bundleWithIdentifier_('com.apple.framework.IOKit')
functions = [("IOServiceGetMatchingService", b"II@"), ("IOServiceMatching", b"@*"),]
objc.loadBundleFunctions(IOKit, globals(), functions)

当我尝试像这样调用函数时,问题出现了:

IOServiceMatching('AppleSmartBattery')

接收

Traceback (most recent call last):
File "<pyshell#53>", line 1, in <module>
IOServiceMatching('AppleSmartBattery')
ValueError: depythonifying 'charptr', got 'str'

作为字节对象,我得到:

IOServiceMatching(b'AppleSmartBattery')
{
IOProviderClass = AppleSmartBattery;
}

相关内容

  • 没有找到相关文章

最新更新