我想以字节为单位传输数据,我认为这是关于字节顺序的
i want to transmit data by byte unit and i think it's metter about endianness
我想以位为单位传输数据,所以我使用 char* 变量访问数据。这是我的代码。
int main()
{
//initiate int variable and casting with char*
int a = 65;
cout << a << endl;
char* p = reinterpret_cast<char*>(&a);
cout << "------------------" << endl;
//check char* p is pointing &a
cout << &a << endl;
printf("0x%x\n", p);
cout << "------------------" << endl;
//access int variable with byte unit
cout << (int)*(p + 0) << endl;
cout << (int)*(p + 1) << endl;
cout << (int)*(p + 2) << endl;
cout << (int)*(p + 3) << endl;
cout << "------------------" << endl;
//initiate int variable and assemble with char* access in way 1
int* b = new int(0);
*b = *(p + 0) << 24;
*b += *(p + 1) << 16;
*b += *(p + 2) << 8;
*b += *(p + 3);
cout << *b << endl;
cout << "------------------" << endl;
//initiate int variable and assemble with char* access in way 2
*b = *(p + 0);
*b += *(p + 1) << 8;
*b += *(p + 2) << 16;
*b += *(p + 3) << 24;
cout << *b << endl;
return 0;
}
然后像这样输出。
65 -> variable a is 65
------------------
0x61ff04
0x61ff04 -> char* p is pointing right
------------------
65
0
0
0 -> access with byte unit
------------------
1090519040 -> way 1
------------------
65 -> way 2
当我以字节为单位访问数据时,第一个地址指向数据显示“65”,所以我认为这个系统是大端。
所以我想如果我想将 'a' 数据传输到变量 'b',那么 *(p+0) 数据应该像方式 1 一样首先进入,但结果不是正确的。 *(p+0) 最后走 - 方式 2,显示正确的值。
以简单的方式思考,我想我是像这样点对点地在直接内存中传输数据
variable a => variable b
[0x000000] => [0x100000]
[0x000001] => [0x100001]
[0x000002] => [0x100002]
... => ...
我不知道为什么会这样。有人可以解释一下吗?
=========================================== ===============================
问题已解决。该系统不是大端。我错了。
when i access data by byte unit that first address pointing data shows '65' so i think this system is big endian.
不是,是小端。最低有效字节位于最低地址,值为 65。
关于 'transmitting' 相同类型指针之间的数据,通过逐字节复制普通旧数据,除非您在系统之间移动,否则字节顺序无关紧要。它只在解释中很重要, ( *(p + 0) << 24 ) | ( *(p + 1) << 16 ) | ( *(p + 2) << 8 ) | *(p + 3)
是大端解释,所以给你错误的结果。你已经知道 *p
是 65*p
是 65,所以即使你忘记了 big 或 little 的意思,*(p + 0) << 24
也是错误的。
如果您确实想在系统之间逐字节传输,可以使用 posix 函数 hton*X*()
and ntoh*X*()
将不同的整数类型从主机字节顺序转换为网络字节顺序或从网络字节顺序转换为主机字节顺序。
我想以位为单位传输数据,所以我使用 char* 变量访问数据。这是我的代码。
int main()
{
//initiate int variable and casting with char*
int a = 65;
cout << a << endl;
char* p = reinterpret_cast<char*>(&a);
cout << "------------------" << endl;
//check char* p is pointing &a
cout << &a << endl;
printf("0x%x\n", p);
cout << "------------------" << endl;
//access int variable with byte unit
cout << (int)*(p + 0) << endl;
cout << (int)*(p + 1) << endl;
cout << (int)*(p + 2) << endl;
cout << (int)*(p + 3) << endl;
cout << "------------------" << endl;
//initiate int variable and assemble with char* access in way 1
int* b = new int(0);
*b = *(p + 0) << 24;
*b += *(p + 1) << 16;
*b += *(p + 2) << 8;
*b += *(p + 3);
cout << *b << endl;
cout << "------------------" << endl;
//initiate int variable and assemble with char* access in way 2
*b = *(p + 0);
*b += *(p + 1) << 8;
*b += *(p + 2) << 16;
*b += *(p + 3) << 24;
cout << *b << endl;
return 0;
}
然后像这样输出。
65 -> variable a is 65
------------------
0x61ff04
0x61ff04 -> char* p is pointing right
------------------
65
0
0
0 -> access with byte unit
------------------
1090519040 -> way 1
------------------
65 -> way 2
当我以字节为单位访问数据时,第一个地址指向数据显示“65”,所以我认为这个系统是大端。
所以我想如果我想将 'a' 数据传输到变量 'b',那么 *(p+0) 数据应该像方式 1 一样首先进入,但结果不是正确的。 *(p+0) 最后走 - 方式 2,显示正确的值。
以简单的方式思考,我想我是像这样点对点地在直接内存中传输数据
variable a => variable b
[0x000000] => [0x100000]
[0x000001] => [0x100001]
[0x000002] => [0x100002]
... => ...
我不知道为什么会这样。有人可以解释一下吗?
=========================================== ===============================
问题已解决。该系统不是大端。我错了。
when i access data by byte unit that first address pointing data shows '65' so i think this system is big endian.
不是,是小端。最低有效字节位于最低地址,值为 65。
关于 'transmitting' 相同类型指针之间的数据,通过逐字节复制普通旧数据,除非您在系统之间移动,否则字节顺序无关紧要。它只在解释中很重要, ( *(p + 0) << 24 ) | ( *(p + 1) << 16 ) | ( *(p + 2) << 8 ) | *(p + 3)
是大端解释,所以给你错误的结果。你已经知道 *p
是 65*p
是 65,所以即使你忘记了 big 或 little 的意思,*(p + 0) << 24
也是错误的。
如果您确实想在系统之间逐字节传输,可以使用 posix 函数 hton*X*()
and ntoh*X*()
将不同的整数类型从主机字节顺序转换为网络字节顺序或从网络字节顺序转换为主机字节顺序。