pointers - 将具有多个变量的结构写入单个字节数组

标签 pointers networking types casting rust

我想为以下结构创建一个字节存储,并将两个变量(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();
}

关于pointers - 将具有多个变量的结构写入单个字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36217936/

相关文章:

c# - 除了 System.Type 之外没有任何更多信息的 Cast 对象

C++ -- 确定泛型变量是否为指针

C: 函数返回指针

c - 使用结构和动态内存分配的队列

c - 移动指针后的 Malloc 在 C 中不起作用?

c - 单独发送/接收数据

android - 在RxJava中使用 "skipWhile"结合 "repeatWhen"实现服务器轮询

networking - 如何从 Windows 10 上的容器连接到 docker 主机(Docker for Windows)

scala - 具有抽象类型成员的具体类

python - 无 Python 错误/错误?