[英]How do I use the byteorder crate to read a usize?
我正在編寫一個編碼庫,我想將slice
轉換為usize
。
我看到一個read_uint
方法看起來很有希望,盡管我不確定如何將寄存器大小作為變量獲取,因此可以將其放入函數中。
例如,我想獲得32
上的32位處理器,和64
上的64位處理器。
一種方法是使用mem::size_of
獲得的大小usize
:
use byteorder::{ByteOrder, ReadBytesExt};
fn read_usize<B, R>(mut b: R) -> Result<usize, std::io::Error>
where
B: ByteOrder,
R: ReadBytesExt,
{
b.read_uint::<B>(std::mem::size_of::<usize>()).map(|v| v as usize)
}
另一個是針對不同的體系結構具有不同的功能或功能實現:
fn read_usize<B, R>(mut b: R) -> Result<usize, std::io::Error>
where
B: ByteOrder,
R: ReadBytesExt,
{
if cfg!(target_pointer_width = "64") {
b.read_u64::<B>().map(|v| v as usize)
} else if cfg!(target_pointer_width = "32") {
b.read_u32::<B>().map(|v| v as usize)
} else {
b.read_u16::<B>().map(|v| v as usize)
}
}
也可以看看:
TL; DR有一個不提供read_usize
函數的充分理由,因為它在不同的cpu架構上不一致。
這是一個壞主意。 通常,您要嘗試反序列化某種協議。 此格式應獨立於cpu架構,因此您不能讀取usize,因為它取決於cpu。
假設您有一個簡單的協議,首先要擁有一個數組的大小,然后是n
元素。
+------+---------+
| size | ....... |
+------+---------+
假設該協議說您的大小為4字節長。 現在,您要執行Shepmaster建議的操作,並閱讀取決於您的體系結構的usize。
在x86_64操作系統上,您現在將讀取8個字節,因此吞下了數組中的第一個元素。
在Atmega8上,您的大小為2個字節,因此僅占用您大小的前2個字節(如果少於65k的元素和BigEndian字節順序,則為零)。
這就是為什么沒有read_usize
函數並且它是正確的原因。 您需要決定多久你的大小,閱讀你的片字節的確切金額,然后我們as
將其轉換成usize
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.