c - NetworkByteOrder 是否与 Big endian 相同?
问题描述
我创建了一个演示来证明网络字节顺序与大端相同:
#include "stdio.h"
#include "stdint.h"
#include "winsock2.h"
#define BL32(x) ((((x) & 0x000000ffUL) << 24) | \
(((x) & 0x0000ff00UL) << 8) | \
(((x) & 0x00ff0000UL) >> 8) | \
(((x) & 0xff000000UL) >> 24))
int main(int argc, char* argv[])
{
uint32_t s = INT_MAX; // little endian
uint32_t network = htonl(s);
uint32_t bigendian = BL32(s);
if(network == bigendian) {
printf("nbo is same as big endian\n");
} else {
printf("nbo isn't same as big endian\n");
}
return 0;
}
该程序在 x86(litte endian) Windows PC 上运行,并提供输出:
nbo is same as big endian
我没有在教科书或教程中看到这一点,所以我想确认它是否正确。
顺便说一句,我认为帮助理解网络中的字节顺序非常重要。为什么大多数问题只集中在“大端与小端”...
解决方案
是的。您可以在关于字节顺序的 Wikipedia 文章中阅读它
Big-endian 是数据网络中最常见的格式;Internet 协议族协议中的 IPv4、IPv6、TCP 和 UDP 等字段按照大端顺序传输。因此,大端字节序也称为网络字节序。
您通常不需要知道网络字节顺序是大端还是小端。只需使用ntohX
andhtonX
宏,它就会做正确的事情。如果您使用的硬件与网络协议具有相同的字节顺序,它将不理会该值;如果您在具有相反字节顺序的机器上,它将交换字节。
推荐阅读
- excel - VBA循环使用DataBodyRange.Formula填写表格覆盖前一行
- css - 如何并排放置 3 个 div?没有容器?
- r - 如何以百万为单位设置 Boxplot Y 轴限制
- amazon-web-services - 是否可以使用 AWS Amplify DataStore 查询进行联接?
- django - 来自 python:3.8.3-alpine 的 Docker Image > 1GB
- uwp - 混合现实空间感知系统不工作
- python - 为什么我的情绪分析运行如此缓慢?
- javascript - 使用 React 中的下拉菜单从 API 过滤数据
- angular - 在多个状态之间切换
- javascript - 如何将 html 元素添加到未来的 html 元素(首选 React 或 js)