簡體   English   中英

如何使用字節順序板條箱讀取usize?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM