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

Pointers 将包含多个变量的结构写入单字节数组,pointers,networking,types,casting,rust,Pointers,Networking,Types,Casting,Rust,我想为下面的结构创建一个字节存储器,并将两个变量(tag和I/d)都放入存储器。然后,我想一次性将存储器写入TcpStream;由于服务器端有一个bug,我无法使用多个调用 我需要使用一个包含联合的C风格API。总结构大小为12字节: struct element { int tag; union { int i; double d; } data; } 我该怎么做?也许有更好的方法吗?像这样的事情应该是一个好的开始 您需要使用来处理endianness

我想为下面的结构创建一个字节存储器,并将两个变量(
tag
I
/
d
)都放入存储器。然后,我想一次性将存储器写入
TcpStream
;由于服务器端有一个bug,我无法使用多个调用

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

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

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

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

您需要使用来处理endianness并将字节写入流

元素
类型可以方便地表示为生锈侧的enum

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();
}
extern板条箱字节顺序;
使用std::net::TcpStream;
使用字节顺序::{byteorder,BigEndian,writebytextest};
使用std::io::Write;
枚举元素{
A(i32),
B(f64)
}
impl元素{
fn写入缓冲区(&self,缓冲区:&mut[u8;12]){
设mut buffer=&mut buffer[…];
匹配自我{
元素::A(n)=>{
buffer.write_i32::(0).unwrap();
buffer.write_i32::(n.unwrap();
},
元素::B(n)=>{
buffer.write_i32::(1).unwrap();
buffer.write_f64::(n.unwrap();
},
}
}
}
fn main(){
让mut stream=TcpStream::connect(“127.0.0.1:1234”).unwrap();
设mut buffer=[0u8;12];
设b=元素::b(317.98);
b、 将\写入\缓冲区::(&mut buffer);
stream.write(&buffer).unwrap();
}

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

您需要使用来处理endianness并将字节写入流

元素
类型可以方便地表示为生锈侧的enum

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();
}
extern板条箱字节顺序;
使用std::net::TcpStream;
使用字节顺序::{byteorder,BigEndian,writebytextest};
使用std::io::Write;
枚举元素{
A(i32),
B(f64)
}
impl元素{
fn写入缓冲区(&self,缓冲区:&mut[u8;12]){
设mut buffer=&mut buffer[…];
匹配自我{
元素::A(n)=>{
buffer.write_i32::(0).unwrap();
buffer.write_i32::(n.unwrap();
},
元素::B(n)=>{
buffer.write_i32::(1).unwrap();
buffer.write_f64::(n.unwrap();
},
}
}
}
fn main(){
让mut stream=TcpStream::connect(“127.0.0.1:1234”).unwrap();
设mut buffer=[0u8;12];
设b=元素::b(317.98);
b、 将\写入\缓冲区::(&mut buffer);
stream.write(&buffer).unwrap();
}

由于服务器端有一个bug,我无法在多个调用中执行此操作-仅仅因为您在一个调用中编写它并不意味着服务器将在一个调用中读取它。这取决于网络如何在机器之间路由数据包。我知道这一点。事实上,开发服务器端的白痴们确实希望整个结构能够立即出现。如果不是这样,它就会崩溃。除非明确指出,否则24字节是一个数据包中应该包含的内容,这是很好的。。。这正是我试图避免的。由于服务器端的一个bug,我不能用多个调用来完成它——仅仅因为你在一个调用中编写它并不意味着服务器将在一个调用中读取它。这取决于网络如何在机器之间路由数据包。我知道这一点。事实上,开发服务器端的白痴们确实希望整个结构能够立即出现。如果不是这样,它就会崩溃。除非明确指出,否则24字节是一个数据包中应该包含的内容,这是很好的。。。这就是我试图避免的。@LeontyevGeorgiy如果这个答案对你有用,一定要投赞成票并接受它。我不能公开投反对票;“我还没有得到15%的声誉。”@LeontyevGeorgiy如果这个答案对你有用,一定要投赞成票并接受它。我不能公开投反对票;他还没有15个名声。