共用体の構造体についてサポートが必要です。さまざまなパケットで構成されるバイトストリームを受信しているので、バイトデータをunion structに入れ、structメンバーを介して必要なデータにアクセスしています。問題はuint32_tタイプのメンバーにあります-読み取りはその2バイトをスキップし、そのメンバーを介してアクセスするときに間違った値を示します。完全なデモコードは次のとおりです。
PacketUtils.h
#include <stdint.h>
typedef struct {
uint8_t startSymbol;
uint8_t packetType;
uint32_t deviceId;
uint16_t packetCRC;
} PacketData;
typedef union {
uint8_t *bytes; // stores raw bytes
PacketData *packet;
} Packet;
// Puts bytes into predefined struct
void getPacketFromBytes(void *bytes, Packet *packetRef);
PacketUtils.c
#include <stdio.h>
#include "UnionStruct.h"
void getPacketFromBytes(void *bytes, Packet *packetRef)
{
uint8_t *rawBytes = (uint8_t *)bytes;
packetRef->bytes = rawBytes;
}
発信コード:
// sample byte data
uint8_t packetBytes[] = {0x11, 0x02, 0x01, 0x01, 0x01, 0x03, 0xbb, 0xbd};
Packet packetRef;
getPacketFromBytes(packetBytes, &packetRef);
printf("%x\n", packetRef.packet->startSymbol); // good - prints 0x11
printf("%x\n", packetRef.packet->packetType); // good - prints 0x02
printf("%x\n", packetRef.packet->deviceId); // bad - prints bd bb 03 01
printf("%x\n", packetRef.packet->packetCRC); // bad - prints 36 80 (some next values in memory)
PacketData構造体がuint8_tまたはuint16_tタイプのメンバーで構成されている場合、すべてがOKであり、印刷には正しい値が表示されます。ただし、タイプuint32_tのdeviceIdを出力すると、2バイト(0x01 0x01)がスキップされ、最後の4バイトが取得されます。packetCRCを出力すると、指定されたバイト配列から値が出力されます。これは、packetBytes[12]やpacketBytes[13]などのメモリ内の2つの値です。なぜ2バイトスキップするのかわかりません...