将包含多个变量的结构写入单个字节数组

时间:2016-03-25 10:11:50

标签: pointers networking types casting rust

我想为以下结构创建一个字节存储,并将两个变量(tagi / d)放入存储中。然后我想在一次写入中将存储写入TcpStream;由于服务器端的错误,我不能通过多次通话来完成。

我需要使用涉及联合的C风格的API。总结构大小为12个字节:

struct element {
    int tag;
    union {
        int i; double d;
    } data;
}

我该怎么办?也许有更好的方法吗?

1 个答案:

答案 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();
}