C++ C++;,是否将整数字节打包到字符数组中?

C++ C++;,是否将整数字节打包到字符数组中?,c++,C++,我正在通过网络传输数据,所以尝试设置一个标头,其中前3个字节是消息类型,后4个字节是消息的大小。当我添加一个整数时,对于超过127字节的任何内容,我都会溢出。如何设置这样的标题 这里有一个简单的例子。如果num等于或小于127,则输出是正确的,但如果num等于或大于128,则输出都是错误的 #include <iostream> #include <string> #include <sstream> #include <iomanip> usi

我正在通过网络传输数据,所以尝试设置一个标头,其中前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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
字符串字节asstr(char*src,int size)
{
细流ss;
党卫军
如果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;
}
似乎您正在谈论代码的以下部分,您尝试从char数组中读回整数,然后显示它:

int out = *(x + 3);
cout << "out: " << out << endl;
这被称为类型双关(将某些内存视为包含另一个类型),应该避免使用

相反,您应该按照复制字节的相同方式复制字节:

int out;
memcpy(&out, x + 3, sizeof(out));
还要注意的是,如果您计划通过网络传输二进制数据,任何读取这些数据的机器都必须知道它的终止性

如果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;
}
似乎您正在谈论代码的以下部分,您尝试从char数组中读回整数,然后显示它:

int out = *(x + 3);
cout << "out: " << out << endl;
这被称为类型双关(将某些内存视为包含另一个类型),应该避免使用

相反,您应该按照复制字节的相同方式复制字节:

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

还要注意的是,如果您计划通过网络传输二进制数据,任何读取此数据的机器都必须知道它的终结性。

如果您花时间确切地找出输出“混乱”的原因,那么问题和琐碎的解决方案应该是显而易见的。您确切地了解输出是如何“混乱”的吗基本类型如char或int并不是如C++那样清晰定义的。在这种情况下,char是隐式签名的,所以可以是128到127。如果需要0到255,则需要是一个无符号字符。最好是使用定义的类型,例如uint 8t t(un签署8位int)。<代码> *(x+3)。
的类型为
char
。您是否试图从中读取
int
?在这种情况下,请使用
memcpy
将这些字节复制到
int
值中。如果您花时间弄清楚输出“混乱”的确切原因,问题和琐碎的解决方案应该是显而易见的。您是否确切地理解输出是如何“混乱”的基本类型如char或int并不是如C++那样清晰定义的。在这种情况下,char是隐式签名的,所以可以是128到127。如果需要0到255,则需要是一个无符号字符。最好是使用定义的类型,例如uint 8t t(un签署8位int)。<代码> *(x+3)。的类型为
char
。是否试图从中读取
int
?在这种情况下,请使用
memcpy
将这些字节复制到
int
值中。