从 char[2] 转换为短时反转字节顺序
inverted byte order when casting from char[2] to short
我所拥有的是这个
struct Record
{
unsigned char cat;
unsigned char len[2]={0x00, 0x1b}; // can't put short here because that
// whould change the size of the struct
unsigned char dat[253];
};
Record record;
unsigned short recordlen = *((unsigned short*)record.len);
这会导致recordlen=0x1b00
而不是0x001b
与*reinterpret_cast<unsigned short*>(record.len)
相同
你能解释一下为什么吗?我应该怎么做?
你遇到的叫做"字节序"。在 x86 中,所有数值变量都存储为"小端序",这意味着最低有效字节排在第一位。
从维基百科页面:
小端系统具有以下特性:可以在不使用不同地址的情况下以不同的长度从内存中读取相同的值。
这取决于 CPU 的字节序。见维基百科。
在您的情况下,您有"小字节序",这意味着最低有效字节排在第一位。当您想将数字转换为不同的字节大小时,这很方便:如果您使用长整型来表示短数字,则其表示形式与短数字相同,只是末尾有额外的零。
你能解释一下为什么吗?
因为您不能假设计算机体系结构的特定字节序。
自然的后续问题是你怎么做。幸运的是,您可以通过调用这些函数之一来强制特定的字节顺序 htonl
、 htons
、 ntohl
或 ntohs
。无论您运行它们的计算机体系结构如何,它们都可以工作:
;在接收端,从网络顺序转换为主机顺序。
// Sending end
unsigned short recordlen = calculate_len();
*reinterpret_cast<unsigned short*>(record.len) = htons(recordlen);
// Receiving end
unsigned short recordlen = ntohs(*reinterpret_cast<unsigned short*>(record.len));
unsigned short recordlen = *((unsigned short*)record.len);
这被打破了。 record.len
并没有指向unsigned short
.告诉编译器它只是在撒谎。
我想你想要:
unsigned short recordlen = static_cast<unsigned short>(record.len[0]) * 256 +
static_cast<unsigned short>(record.len[1]);
或者,如果您更喜欢它:
unsigned short recordlen = (static_cast<unsigned short>(record.len[0]) << 8) |
static_cast<unsigned short>(record.len[1]);
如果没有,请编写您真正想要的任何代码。
相关文章:
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- C++ int* 和 char* 字节顺序已交换
- 交换未定义数据类型中的字节顺序
- winsock上的蓝牙,如何删除字节顺序标记
- 将网络字节顺序(大字节序)转换为小字节序
- 将主机字节顺序转换为网络字节顺序有时会导致奇怪的结果
- 当在网络字节顺序中放置双精度时,为什么它是在 4 字节块中完成的
- 使用mysql本机函数进行字节顺序转换
- C++:如何交换wchar_t的字节顺序
- reinterpret_cast接收端的'serializing'数据、字节顺序和对齐方式
- 到Arduino的串行通信的字节顺序
- 使用不带Unicode字节顺序标记的iconv进行字符转换
- 从Byte*到unsigned int的memcpy正在反转字节顺序
- 忽略C++中的字节顺序标记,从流中读取
- iPhone TCP-IP字节顺序映射
- 特定字节顺序的内存c/c++
- 按字节顺序读取UTF-16格式的文件到wstring
- 使用预处理器检查字节顺序
- 确定uint32_t的字节顺序
- 什么可能导致数据包的字节顺序部分混乱?