C++ 如何通过强制转换类型指针将字符数组转换为uint16\t? char字节[2]; 字节[0]=0//0x00 字节[1]=24//0x18 uint16_t*ptrU16=(uint16_t*)字节;//我希望它指向内存块:0x18 你有一台小小的endian机器吗6144为0x1800。当您的计算机在内存中表示16位值0x0018时,它将0x18字节放在第一位,将0x00字节放在第二位,因此当您将两字节序列0x0018解释为uint16\u t时,它将为您提供6144(即0x1800),而不是24(即0x0018)

C++ 如何通过强制转换类型指针将字符数组转换为uint16\t? char字节[2]; 字节[0]=0//0x00 字节[1]=24//0x18 uint16_t*ptrU16=(uint16_t*)字节;//我希望它指向内存块:0x18 你有一台小小的endian机器吗6144为0x1800。当您的计算机在内存中表示16位值0x0018时,它将0x18字节放在第一位,将0x00字节放在第二位,因此当您将两字节序列0x0018解释为uint16\u t时,它将为您提供6144(即0x1800),而不是24(即0x0018),c++,casting,uint16,C++,Casting,Uint16,如果您更改为: char bytes[2]; bytes[0] = 0; //0x00 bytes[1] = 24; //0x18 uint16_t* ptrU16 = (uint16_t*)bytes; // I expect it points to the memory block: 0x18 cout << *ptrU16 << endl; // I expect 24, but it is 6144 你很可能会看到你期望的结果 如果您真的想要得到预期的结果,

如果您更改为:

char bytes[2];
bytes[0] = 0; //0x00
bytes[1] = 24; //0x18
uint16_t* ptrU16 = (uint16_t*)bytes; // I expect it points to the memory block: 0x18
cout << *ptrU16 << endl;  // I expect 24, but it is 6144
你很可能会看到你期望的结果

如果您真的想要得到预期的结果,那么您必须手动计算,例如:

bytes[0] = 24; 
bytes[1] = 0;

uint16\u t n=(bytes[1]您可能需要查看
ntohs()
函数。(“网络到主机字节顺序转换”)。您已以big-endian模式插入数据,这通常也是网络字节顺序。无论您在哪台主机上,ntohs()都会函数应该返回您期望的值。有一个镜像函数用于从主机到网络的顺序

char bytes[] = {0x18, 0x00};
uint16_t n = 0;
for ( size_t i = 0; i < 2; ++i ) {
    n += bytes[i] << 8 * i;
}
std::cout << n << std::endl;
#包括
...

难道这一切都是关于。你的期望是错误的,而不是你的代码。这违反了,也许也与密切的选民一致:问题包括所有的信息,只是隐藏在评论中…;)谢谢,保罗。非常清楚。那么我如何更正代码以得到我想要的?
char bytes[] = {0x18, 0x00};
uint16_t n = 0;
for ( size_t i = 0; i < 2; ++i ) {
    n += bytes[i] << 8 * i;
}
std::cout << n << std::endl;
#include <arpa/inet.h>
...
cout << htons(*ptrU16) << endl;