【问题标题】:Write a struct with multiple variables into a single byte array将具有多个变量的结构写入单字节数组
【发布时间】:2016-03-25 10:11:50
【问题描述】:

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

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

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

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

【问题讨论】:

  • 由于服务器端的一个错误,我不能通过多次调用来做到这一点 - 仅仅因为你在一次调用中编写它并不意味着服务器会一口气读完。这取决于网络如何在机器之间路由数据包。
  • 我知道这一点。事情是,开发服务器端的白痴,实际上确实期望整个结构会立即出现。如果不是这种情况,它会崩溃。除非明确指出,否则 24 字节应该在单个数据包中出现,这很好……这就是我试图避免的。

标签: pointers networking types casting rust


【解决方案1】:

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

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

【讨论】:

  • @LeontyevGeorgiy 如果答案对您有用,请务必点赞并接受。
  • 我不能公开投票;还没有 15 声望。
猜你喜欢
  • 2017-04-13
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多