我想为以下结构创建一个字节存储,并将两个变量(tagi/d)放入存储中。然后,我想通过一次写入将存储写入TcpStream中;由于服务器端的错误,我无法通过多次调用来做到这一点。

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

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

我该怎么做?也许有更好的方法呢?

最佳答案

这样的事情应该是一个好的开始。

您需要使用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();
}

10-02 04:55