将Char-Array解释为多个连接的数据类型

时间:2015-03-20 10:57:23

标签: c++ arrays casting char byte

我通过Socket接收一个字节流(或C ++中的字符)。现在我想解释它们。我知道哪些数据类型隐藏在字节后面。我的消息看起来像是那样:

value1   --> char (1 byte)
value2   --> long (8 bytes)
value3   --> short (2 bytes)
... 

如何有效地实现解释?

//编辑:不起作用,字节不描述字符而是整数。

我想做的是使用memcpy和atoi(目前尚未测试):

char value1 = *charPtr;
charPtr++;

char value2[8]="";
std::memcpy(charPtr,value2,8);
long v2 = atoi(value2);
charPtr+=8;

char value3[2]="";
std::memcpy(charPtr,value3,2);
short v3 = atoi(value3);
charPtr+=2;

3 个答案:

答案 0 :(得分:0)

我假设您尝试将数据作为原始字节流发送,并且您已确信发送方和接收方使用相同的浮点格式相同的持久性

但是您的打包数据流显然违反了发送方和接收方之间的对齐规则,因此我们无法执行value2 = *(long *)data;

之类的操作

所以,请尝试使用parsePackedStruct(data, &value1, &value2, &value3);

合理的实施可以是:

void parsePackedStruct(char *data, char *pValue1, long *pValue2, short *pValue3)
{
    memcpy(pValue1, data, sizeof(*pValue1));
    data = data + sizeof(*pLalue1);
    memcpy(pValue2, data, sizeof(*pValue2));
    data = data + sizeof(*pLalue2);
    memcpy(pValue3, data, sizeof(*pValue3));
}

这要求您的发件人和收件人的char/short/long大小完全相同,这似乎对我来说太严格了,因为long的大小在不同平台之间的变化比其他算术类型更多。出于同样的原因,我也会避免bool并使用uint8_t

因此,请考虑像int32_t这样的C99整数类型。

答案 1 :(得分:0)

假设发送方和接收方与发送/接收的原始数据完全同步,您可以这样做:

#pragma pack(push, 1)
struct MyPackedData {
  char c;
  long l;
  short s;
};
#pragma pack(pop)

...

MyPackedData parsedData;
memcpy(&parsedData, charPtr, sizeof(parsedData));

答案 2 :(得分:0)

哦,我知道如何做到这一点。关键字是位移:

long readAndSkipLong(char*& b)
{
    unsigned long ret = (b[0] << 56) | (b[1] << 48) | (b[2] << 40) | (b[3]<<32) | (b[4] << 24) | (b[5] << 16) | (b[6] << 8) | (b[7]);
    b+=8;
    return ret;
}

int readAndSkipInt(char*& b)
{
    int32_t ret = (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | (b[3]);
    b+=4;
    return ret;
}

short readAndSkipShort(char*& b) {
    short ret =  (b[0] << 8) | (b[1]);
    b+=2;
    return ret;
}

...
while (readChar(it)!='#') // stop at the terminating char
{
        readAndSkipShort(it);
        readAndSkipInt(it);
}
...

尽管如此,我对长期和整体的转变似乎并不正确。对于预期值

152  --> 00000000 00000000 00000000 00000000 00000000 00000000 00000000 10011000

我解读:

-104  --> 11111111 11111111 11111111 11111111 11111111 11111111 11111111 10011000 

知道bug在哪里?