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