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. 什麼是複製QT中的兩個二進制文件的最佳方式
- 5. 解碼二進制協議消息
- 6. 用C++解析二進制協議的好庫
- 7. 從iOS的URL解析XML的最佳方式是什麼?
- 8. 什麼是解析Microsoft Office和PDF文檔的最佳方式?
- 9. 什麼是解析和替換字符串的最佳方式?
- 10. 在Perl中解析Excel文件的最佳方式是什麼?
- 11. 在PHP中解析PayPal NVP的最佳方式是什麼?
- 12. PowerShell解析這些字符串的最佳方式是什麼?
- 13. 解析字符串的最佳方式是什麼?
- 14. 解析URL以提取域的最佳方式是什麼?
- 15. JSF推遲解析JavaScript的最佳方式是什麼?
- 16. 什麼是解析短信電子郵件的最佳方式?
- 17. 在Ruby中解析網頁的最佳方式是什麼?
- 18. Lua memcached二進制協議
- 19. php,memcached,二進制協議
- 20. 在Cocoa Touch中解析二進制文件的最簡單方法是什麼?
- 21. 從webservice返回大塊二進制數據的最佳方式是什麼?
- 22. 分發.Net二進制文件和PDB的最佳方式是什麼?
- 23. 更改Git回購協議來源的最佳方式是什麼?
- 24. 在Ruby中解析製表符分隔文件的最佳方式是什麼?
- 25. 什麼是與Firefox插件進行通信的最佳方式
- 26. 什麼是編輯代碼的最佳協作方式? (實時)
- 27. Rails:模擬這個has_and_belongs_to_many協會的最佳方式是什麼
- 28. 建議Delphi的新功能的最佳方式是什麼?
- 29. 什麼是解包的「二進制串」
- 30. 什麼是聊天室軟件的最佳開放協議?
我想在這種類型的解析存在的時候,真的沒有辦法繞過不安全的塊。感謝您的解決方案。 – 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