簡體   English   中英

將Char數組解釋為多個串聯的數據類型

[英]Interpreting Char-Array to Multiple concatenated Datatypes

我通過套接字收到字節流(或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;

我假設您嘗試將數據作為原始字節流發送,並且已經確定發送方和接收方使用相同的浮點格式相同的endiness

但是您打包的數據流顯然違反了發送方和接收方的對齊規則,因此我們無法執行類似於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整數類型。

假設發送方和接收方在發送/接收的原始數據方面完全同步,則可以執行以下操作:

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

...

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

Okey,我知道了該怎么做。 關鍵字是移位:

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 

知道錯誤在哪里嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM