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