为什么 std::copy 顺序相反
why std::copy in reverse order
我想将一个字节序列复制成整数值,大概他们会随心所欲地使用端口的 UPD
#include <iostream>
#include <cstring>
int main()
{
uint8_t arr[8];
uint32_t arrNew[2];
arr[0] = 0x11;
arr[1] = 0x22;
arr[2] = 0x33;
arr[3] = 0x44;
arr[4] = 0x55;
arr[5] = 0x66;
arr[6] = 0x77;
arr[7] = 0x88;
memcpy(arrNew, arr, 8);
std::cout << std::hex << arrNew[0] << "\n"; //out: 0x44332211
std::cout << std::hex << arrNew[1] << "\n"; //out: 0x88776655
return 0;
}
应该是:
arrNew[0] = 0x11223344
arrNew[1] = 0x55667788.
这是一件非常脆弱的事情。正如其中一条评论中提到的,这取决于字节顺序。 0x01020304号可以存储:
x01
x02
x03
x04
但在其他人身上,情况恰恰相反。这是大端与小端。 little endian vs. big endian
的 google 会产生一些值得阅读的好页面,所以我不打算在这里全部写下来。
在您使用的硬件上,字节序与您期望的相反。
基本上,你不能假设。有一些方法可以处理网络字节顺序。这个问题有更多信息:How do you write (portably) reverse network byte order?
我想将一个字节序列复制成整数值,大概他们会随心所欲地使用端口的 UPD
#include <iostream>
#include <cstring>
int main()
{
uint8_t arr[8];
uint32_t arrNew[2];
arr[0] = 0x11;
arr[1] = 0x22;
arr[2] = 0x33;
arr[3] = 0x44;
arr[4] = 0x55;
arr[5] = 0x66;
arr[6] = 0x77;
arr[7] = 0x88;
memcpy(arrNew, arr, 8);
std::cout << std::hex << arrNew[0] << "\n"; //out: 0x44332211
std::cout << std::hex << arrNew[1] << "\n"; //out: 0x88776655
return 0;
}
应该是: arrNew[0] = 0x11223344 arrNew[1] = 0x55667788.
这是一件非常脆弱的事情。正如其中一条评论中提到的,这取决于字节顺序。 0x01020304号可以存储:
x01 x02 x03 x04
但在其他人身上,情况恰恰相反。这是大端与小端。 little endian vs. big endian
的 google 会产生一些值得阅读的好页面,所以我不打算在这里全部写下来。
在您使用的硬件上,字节序与您期望的相反。
基本上,你不能假设。有一些方法可以处理网络字节顺序。这个问题有更多信息:How do you write (portably) reverse network byte order?