7
A
回答
7
你也可以在Rust中做同樣的事情。您在定義結構時必須小心謹慎。
use std::mem;
#[repr(C)]
#[packed]
struct YourProtoHeader {
magic: u8,
len: u32
}
let mut buf = [0u8, ..1024]; // large enough buffer
// read header from some Reader (a socket, perhaps)
reader.read_at_least(mem::size_of::<YourProtoHeader>(), buf.as_mut_slice()).unwrap();
let ptr: *const u8 = buf.as_ptr();
let ptr: *const YourProtoHeader = ptr as *const YourProtoHeader;
let ptr: &YourProtoHeader = unsafe { &*ptr };
println!("Data length: {}", ptr.len);
不幸的是,我不知道如何指定緩衝區是完全size_of::<YourProtoHeader>()
大小;緩衝區長度必須是一個常量,但size_of()
調用在技術上是一個函數,所以Rust在數組初始值設定項中使用它時會抱怨。儘管如此,足夠大的緩衝區也可以工作。
這裏我們將一個指針指向緩衝區的開頭,指向結構的指針。這與C中的操作相同。結構本身應該註釋爲#[repr(C)]
和屬性:第一個不允許可能的字段重新排序,第二個禁用字段對齊的填充。
相關問題
- 1. 二進制協議與文本協議
- 2. 緩存二進制數據的最佳方式是什麼?
- 3. 實現協議的最佳方式是什麼?
- 4. 實現UICollectionViewDataSource協議的最佳方式是什麼?
- 5. 什麼是複製QT中的兩個二進制文件的最佳方式
- 6. 在Rust 1.3中繼承結構的最佳方式是什麼?
- 7. 解碼二進制協議消息
- 8. 從iOS的URL解析XML的最佳方式是什麼?
- 9. 用C++解析二進制協議的好庫
- 10. 爲Java中的現有二進制協議生成解析器
- 11. iOS RestKit 0.2什麼是解析本地Json的最佳方式
- 12. 解析字符串的最佳方式是什麼?
- 13. 在Ruby中解析網頁的最佳方式是什麼?
- 14. JSF推遲解析JavaScript的最佳方式是什麼?
- 15. 什麼是解析Microsoft Office和PDF文檔的最佳方式?
- 16. 用Perl解析複雜XML的最佳方式是什麼?
- 17. PowerShell解析這些字符串的最佳方式是什麼?
- 18. Ruby:什麼是解析XML的最佳方式?
- 19. 什麼是解析短信電子郵件的最佳方式?
- 20. 在PHP中解析PayPal NVP的最佳方式是什麼?
- 21. 解析URL以提取域的最佳方式是什麼?
- 22. 什麼是解析和替換字符串的最佳方式?
- 23. 在Perl中解析Excel文件的最佳方式是什麼?
- 24. 二進制與文本協議
- 25. Lua memcached二進制協議
- 26. php,memcached,二進制協議
- 27. 二進制事件協議
- 28. 在Cocoa Touch中解析二進制文件的最簡單方法是什麼?
- 29. 分發.Net二進制文件和PDB的最佳方式是什麼?
- 30. 從webservice返回大塊二進制數據的最佳方式是什麼?
我想在這種類型的解析存在的時候,真的沒有辦法繞過不安全的塊。感謝您的解決方案。 – Matt 2014-09-08 12:21:54
@Matt,是的,重新解釋一段內存是非常不安全的。如果你不想'unsafe',你可以將'buf'包裝到'BufReader'中並使用['Reader'](http://doc.rust-lang.org/std/io/trait.Reader.html)方法,比如'read_be_u32()'。無論如何,這可能是一個好主意,因爲重新解釋一段內存不會讓你調整永恆性,所以你的程序不能移植。 – 2014-09-08 12:59:41