我想为以下结构创建一个字节存储,并将两个变量(tag
和i
/ d
)放入存储中。然后我想在一次写入中将存储写入TcpStream
;由于服务器端的错误,我不能通过多次通话来完成。
我需要使用涉及联合的C风格的API。总结构大小为12个字节:
struct element {
int tag;
union {
int i; double d;
} data;
}
我该怎么办?也许有更好的方法吗?
答案 0 :(得分:3)
这样的事情应该是一个好的开始。
您需要使用byteorder crate来处理字节序并将字节写入流。
element
类型可以方便地表示为Rust侧的枚举。
extern crate byteorder;
use std::net::TcpStream;
use byteorder::{ByteOrder, BigEndian, WriteBytesExt};
use std::io::Write;
enum Element {
A(i32),
B(f64)
}
impl Element {
fn write_to_buffer<T: ByteOrder>(&self, buffer: &mut [u8; 12]) {
let mut buffer = &mut buffer[..];
match *self {
Element::A(n) => {
buffer.write_i32::<T>(0).unwrap();
buffer.write_i32::<T>(n).unwrap();
},
Element::B(n) => {
buffer.write_i32::<T>(1).unwrap();
buffer.write_f64::<T>(n).unwrap();
},
}
}
}
fn main() {
let mut stream = TcpStream::connect("127.0.0.1:1234").unwrap();
let mut buffer = [0u8; 12];
let b = Element::B(317.98);
b.write_to_buffer::<BigEndian>(&mut buffer);
stream.write(&buffer).unwrap();
}