如何通过转换类型指针将char数组转换为uint16_t?

时间:2014-12-19 02:34:01

标签: 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

我的代码有什么问题?

2 个答案:

答案 0 :(得分:4)

你有一台小端机器。 61440x1800。当您的机器在内存中表示16位值0x0018时,它会先放置0x18字节,然后放置0x00字节,这样当您解释两个字节序列0x0018时作为uint16_t,它会为您6144(即0x1800),而不是24(即0x0018)。

如果您更改为:

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

你可能会看到你期望的结果。

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

uint16_t n = (bytes[1] << 8) + bytes[0];

或者更一般地说:

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;

或者您可以使用ntohs()之类的函数,因为网络字节顺序是大端。

答案 1 :(得分:0)

您可能需要查看ntohs()功能。 (&#34;网络到主机字节顺序转换&#34;)。您已经以big endian模式插入数据,传统上也是网络字节顺序。无论您使用什么主机,ntohs()函数都应该返回您期望的值。它具有从主机到网络顺序的镜像功能。

#include <arpa/inet.h>
...
cout << htons(*ptrU16) << endl;

应该可以工作并且可以跨系统移植。 (即应该使用Power,ARM,X86,Alpha等)。