【问题标题】:How to create binary data packet using union struct?如何使用联合结构创建二进制数据包?
【发布时间】:2012-11-05 18:27:29
【问题描述】:

我需要用 C 代码创建二进制数据包。但是,我错过了一些基本点。目前,已经定义了结构,我需要使用它们(至少用于读取数据包数据)。相同的结构将用于接收的数据包和发送的数据包。以下是数据包结构:

typedef struct {

  uint8_t packetType;
  uint16_t packetBody;

} MyStruct;

还有另一个结构:

typedef union {

  const uint8_t *bytes; 
  MyStruct *packet;

} MyPacket;

这里的函数应该接受一个指向结构体的指针,用数据填充它并返回:

void packetWithBytes(MyPacket *packet)
{
  packet->packet->packetType = 1; // crashed with EXC_BAD_ACCESS
  packet->packet->packetBody = 3;
}

这是对我的函数的调用,它应该返回一个指向二进制数据的指针:

MyPacket *packetRef;
packetWithBytes(packetRef); 

NSData *data = [NSData dataWithBytes:packetRef->bytes length:sizeof(packetRef->bytes)];

我觉得我应该在某个地方分配一些空间(使用malloc),但不知道在哪里以及如何做。调用部分代码不应该知道有关数据包大小的任何细节。尝试进行分配但得到相同的错误:

void packetWithBytes(MyPacket *packet)
{
  packet->bytes = malloc(sizeof(uint8_t) + sizeof(uint16_t)); //crash
  packet->packet->packetType = 1;
  packet->packet->packetBody = 3;
}

尝试从MyStruct 成员字节中删除const,但得到相同的错误。我对C不是很熟悉,所以非常感谢帮助。

【问题讨论】:

  • 请注意,这是自找麻烦。 struct 成员的二进制布局规则最好取决于平台,如果不是特定于编译器的话。
  • @SimonRichter 更不用说甚至没有联合只有结构。我觉得 OP 还有很多东西要学。
  • 听听西蒙·里希特在说什么。如果您需要进行二进制序列化,请考虑跨编译器/跨平台,例如 Google Protocol Buffers

标签: objective-c c


【解决方案1】:
MyPacket *packetRef;
packetWithBytes(packetRef);

是问题所在。 packetRef 是一个未初始化的指针,因此它可能指向无效的内存位置 - 取消引用它是未定义的行为。您可以通过两种方式解决此问题:

MyPacket *packetRef = malloc(sizeof(*packetRef));
packetWithBytes(packetRef);

MyPacket packetRef;
packetWithBytes(&packetRef);

【讨论】:

  • MyPackets' packet 也需要在函数调用之前或内部分配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 2021-10-11
  • 1970-01-01
  • 2012-08-14
相关资源
最近更新 更多