rust - 为什么 to_be_bytes() 和 to_le_bytes() 与我在这里期望的相反?
问题描述
也许问题应该是“为什么我希望 to_be_bytes() 和 to_le_bytes() 在这里做相反的事情?”,但无论如何,情况如下:
fn main() {
let buf: [u8; 2048] // Buffer I use to receive UDP messages
let (_, entry, _) = unsafe { buf[14..].align_to::<u16>() };
// In memory entry looks like: 00 44 16 15 21 04 03 5a 03 67 03 6a 03 64 88 91
let [first, second] = entry[0].to_be_bytes();
assert_eq!(first, 0x44);
assert_eq!(second, 0x00);
}
不应该是相反的吗?大字节序不是像在内存中保留顺序一样吗?
解决方案
Big endian 意味着首先存储(或传输)高字节,即在最低地址。英特尔处理器是小端的,这意味着低字节存储在低地址中。
每个都有一些优点,但通常首选大端,这就是为什么网络协议和可移植数据格式通常是大端的原因。为了与旧版本兼容,英特尔仍然是小端。一些 CPU 具有可以在两者之间切换的模式,但英特尔从未这样做过。
推荐阅读
- macos - 以编程方式将 Web 应用程序快捷方式添加到 macOS Dock
- c# - 使用 ModelStoreConatiner 名称作为 Schema 对特定表查询 db 的 EF 查询
- assembly - 我应该使用哪个汇编程序在 dosbox 中编译此代码
- javascript - 需要帮助在函数中更改 SVG 的颜色 - Skycons
- node.js - 在 QueryFile 中进行多次插入
- spring - Spring Batch 如何执行 Skip 或不考虑编写?
- express - 连接gridfs multer和mongodb时缺少db参数错误
- mysql - MySQL 基于表定义创建或更新
- c - 如何使用 FFMpeg 将图像转换为视频以用于嵌入式应用程序?
- c# - 防止新数据快照创建额外的孩子