Python 如何在Objective-C中读取struct.pack编码字符串?

Python 如何在Objective-C中读取struct.pack编码字符串?,python,ios,objective-c,sockets,Python,Ios,Objective C,Sockets,我有一个Python服务器,它使用struct.pack函数将数据以字节的形式发送到客户端。数据被构造为结构包(“!bhh”,0x1,x,y,z) 如何读回Objecive-C中客户端的所有参数 我现在使用以下代码: NSString*命令=[[NSString alloc]initWithBytes:缓冲区长度:len编码:NSASCIIStringEncoding] 并得到一个结果 这不是字符串数据。不要使用NSString 您需要定义具有等效布局的结构。这有点棘手,因为您使用的结构排列得很

我有一个Python服务器,它使用struct.pack函数将数据以字节的形式发送到客户端。数据被构造为结构包(“!bhh”,0x1,x,y,z)

如何读回Objecive-C中客户端的所有参数

我现在使用以下代码:
NSString*命令=[[NSString alloc]initWithBytes:缓冲区长度:len编码:NSASCIIStringEncoding]
并得到一个结果

这不是字符串数据。不要使用NSString

您需要定义具有等效布局的结构。这有点棘手,因为您使用的结构排列得很奇怪:

struct __attribute__((__packed__)) {
    uint8_t b;
    uint16_t h1, h2, h3;
} *bhhh = (void *) buffer;
您现在可以将该字段的内容称为
bhh->b
bhh->h1
,等等


请注意,我使用的名称完全是假的,因为我不知道数据代表什么。不要一字不差地复制它们。

因为您正在使用
前缀,数据以大端写。这会阻止您简单地将输入数据类型转换为适当的类型

因此,您需要使用位移位计算单词(三个
h
值)。您可以轻松创建宏以简化此操作:

// Read a byte (b) from buf at pos
#define GET_B(buf, pos) (uint8)buf[0]
// Read a (signed) word (H) from buf at pos
#define GET_h(buf, pos) ((int8_t)buf[pos+1] | (int8_t)buf[pos]<<8)
// Read an (unsigned) word (h) from buf at pos
#define GET_H(buf, pos) ((uint8)buf[pos+1] | (uint8)buf[pos]<<8)

请注意不同数据类型占用的字节数
b
仅为一个字节,而
h
为两个字节。因此偏移量是0、1、3和5。

谢谢,这让我了解了它的工作原理。我在有符号整数方面仍然有问题。我尝试使用pos=1,2,3的(int16_t)buf[pos],但是它溢出了负值。哦,对不起,我忘记了“h”实际上是有符号的。我更新了我的帖子。现在你得到了签名的_h和未签名的_h。
    // created with struct.pack('!bhhh', 1, -200, -300, -400)
    unsigned char input[] = {0x01, 0xff, '8', 0xfe, 0xd4, 0xfe, 'p'};

    NSLog(@"a: %d", GET_B(input, 0));
    NSLog(@"x: %d", GET_h(input, 1));
    NSLog(@"y: %d", GET_h(input, 3));
    NSLog(@"z: %d", GET_h(input, 5));