簡體   English   中英

C++,將整數字節打包成一個字符數組?

[英]C++, pack integer bytes into a char array?

我正在通過網絡傳輸數據,因此嘗試設置一個標頭,其中前 3 個字節是消息類型,接下來的 4 個字節是消息的大小。 當我添加一個整數時,對於超過 127 個字節的任何內容,我都溢出了。 我如何設置這樣的標題?

這是一個簡單的例子。 如果 num 為 127 或更少,則輸出是正確的,但如果 num 為 128 或更多,則輸出完全混亂。

#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>

using namespace std;

string bytesAsStr(char* src, int size)
{
    stringstream ss;
    ss << std::hex;
    for (int i = 0; i < size; i++)
    {
        ss << std::setw(2) << std::setfill('0') << (int)src[i] << " ";
    }

    return ss.str();
}

int main()
{
    // 3 chars + 1 int 
    const int size = 3 + sizeof(int);
    char x[size];
    memcpy(x, "lsa", 3);

    int num = 129;
    memcpy(x + 3, &num, sizeof(int));

    cout << bytesAsStr(x, size) << endl;

    int out = *(x + 3);
    cout << "out: " << out << endl;
}

如果 num 為 127 或更少,則輸出是正確的,但如果 num 為 128 或更多,則輸出完全混亂。

看來您正在談論代碼的以下部分,您嘗試從 char 數組中讀取整數然后顯示它:

int out = *(x + 3);
cout << "out: " << out << endl;

問題是x + 3char*類型,當您取消引用它時,它變成了一個char值。 在您的系統上,該值是有符號的,整數顯然是以小端格式存儲的。 所以,你認為它對小於 128 的值“有效”。但實際上這甚至不是真的。 對於小於 -128 的值,它也會中斷。

你看,即使你把它分配給一個int ,它仍然只是一個char 該 char 值只是被復制到更大的整數類型中。

看起來你真的想要這個:

int out = *(int*)(x + 3);  // DON'T DO THIS!

這稱為類型雙關(將某些內存視為包含另一種類型),應該避免!!!

相反,您應該像復制字節一樣復制字節:

int out;
memcpy(&out, x + 3, sizeof(out));

另請注意,如果您計划通過網絡傳輸二進制數據,則任何讀取此數據的機器都必須了解其字節序

暫無
暫無

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

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