我想听听你的建议。我需要使用tcp客户机/服务器来实现一些协议。它有几个网格,其中一些字节数为奇数,如:
typedef struct _msg1
{
unsigned short opcode
unsigned char value
}msg1;您认为实现它的最佳方法是什么,以避免字节排序问题。我想出了以下原则:
有些网格比较难看,比如在运行之前它的字节数是未知的,我仍然不确定如何最好地定义它来发送。
typedef struct _msg_errors
{
unsigned short opcode
unsigned char errortable[DEPENDS_ON_NUMBER_OF_REAL_ERRORS]
}msg_errors;谢谢,Ran
发布于 2014-07-01 21:27:56
我倾向于避免将“覆盖转换”作为读取结构化数据的一种手段。如果性能不重要,那么定义以下方法可能会有所帮助:
int getBE16(uint8_t **p) { // Big-endian 16-bit
uint8_t *pp = *p;
int result = pp[0]*256 + pp[1];
(*p)+=2;
}
int getLE16(uint8_t **p) { // Little-endian 16-bit
uint8_t *pp = *p;
int result = pp[0] + 256*pp[1];
(*p)+=2;
}
int getBE32(uint8_t **p) { // Big-endian 32-bit
uint8_t *pp = *p;
int result = ((pp[0]*256 + pp[1])*256 + pp[2])*256 + pp[3];
(*p)+=4;
}
int getLE32(uint8_t **p) { // Little-endian 16-bit
uint8_t *pp = *p;
int result = pp[0] + 256*(pp[1] + 256*(pp[2] + 256*pp[3]));
(*p)+=4;
}给定一个数组uint8_t dat[6]和一个由8位值、16位小端点值和32位大值按顺序组成的结构,然后我们会写:
uint8_t *p = dat;
mystruct.theByte = *p++;
mystruct.theHalfword = getLE16(&p);
mystruct.theWord = getBE32(&p);上述代码将是可移植的,与字节顺序无关。如果可以消除函数调用和指针算法,则会更好,但要消除这些调用,则需要显式地指定数据结构中每个字段的偏移量,或者使用一些非常讨厌的宏来这样做。
https://stackoverflow.com/questions/24518848
复制相似问题