我基于字节定义了一个结构,大小为3个字节。 (1个packetID和2个packetSize)我使用sizeof函数检查了大小,并且效果很好:
#pragma pack(1)
typedef struct ENVIRONMENT_STRUCT{
unsigned char packetID[1];
unsigned char packetSize[2];
}
我创建了一个这样的变量并保留了内存:
ENVIRONMENT_STRUCT * environment_struct = new ENVIRONMENT_STRUCT();
现在我要初始化 environment_struct 。
问题在于我正试图通过属性初始化此结构,就像这样:
*environment_struct->packetSize = 100;
但是当我检查此值时,使用:
std::cout << "Packet Size: " << environment_struct->packetSize << endl;
结果:数据包大小:d
预期结果:数据包大小:100
如果我将使用数字,是否应该使用csdint库定义结构?例如,u_int8和这种类型的变量。
答案 0 :(得分:3)
这样做的时候
ENVIRONMENT_STRUCT * environment_struct = new ENVIRONMENT_STRUCT();
您将packetSize
初始化为{0, 0}
。然后
*environment_struct->packetSize = 100;
将数组转换为{100, 0}
。由于当您使用
cout
时,该数组是一个字符数组
std::cout << "Packet Size: " << environment_struct->packetSize << endl;
将其视为c字符串并打印出字符串内容。由于您看到d
,这意味着您的系统正在使用ascii,因为字符'd'
的整数表示为100
。要查看100
,您需要将其投射到int
之类的
std::cout << "Packet Size: " << static_cast<int>(*environment_struct->packetSize) << endl;
请注意,由于packetSize
是由两个字符组成的数组,因此您实际上无法分配一个占用整个空间的单个值。如果需要,则需要使用固定宽度类型,例如
typedef struct ENVIRONMENT_STRUCT{
uint8_t packetID; // unsigned integer that is exactly 8 bits wide. Will be a compiler error if it does not exist
uint16_t packetSize; // unsigned integer that is exactly 16 bits wide. Will be a compiler error if it does not exist
};
int main()
{
ENVIRONMENT_STRUCT * environment_struct = new ENVIRONMENT_STRUCT();
environment_struct->packetSize = 100;
std::cout << "Packet Size: " << environment_struct->packetSize << std::endl;
}
答案 1 :(得分:1)
让我们首先考虑*environment_struct->packetSize = 100;
的作用。它将ENVIRONMENT_STRUCT::packetSize
的第一个字节设置为100。更常规的语法是:environment_struct->packetSize[0] = 100
。
实际上,没有任何一种方法可以初始化结构体,以使表达式std::cout << environment_struct->packetSize
的输出结果为100。让我们考虑一下这样做的结果。 environment_struct->packetSize
是一个数组,在这种情况下,它会衰减为指向第一个元素的指针。插入字符流中的字符指针被解释为以null结尾的字符串。幸运的是,您已经对environment_struct->packetSize
的第二个字节进行了值初始化,因此您的数组的确以null结尾。第一个字节的值被解释为编码字符。在系统编码中,d
字符被编码为值100。
如果要打印设置为100的environment_struct->packetSize
的第一个字节的数值,可以使用:
std::cout << "Packet Size: " << (int)environment_struct->packetSize[0] << endl;
答案 2 :(得分:0)
由于packetSize被声明为char型,因此将其输出为字符。 (字符“ d”的ASCII码为100 ...)
尝试将其转换为整数类型:
std::cout << "Packet Size: " << (int)environment_struct->packetSize << endl;
或者,由于您似乎希望将数字存储为2字节类型,因此可以避免进行此类强制转换,只需将packetSize
声明为unsigned short
。 cout
会将其解释为整数类型。
答案 3 :(得分:0)
当您尝试打印字符符号而不是整数时,会得到此结果。
要解决此问题,只需根据需要转换值或将其声明为整数即可。
广播示例:
std::cout << "Packet Size: " << static_cast<int>(*environment_struct->packetSize) << std::endl;