代码之家  ›  专栏  ›  技术社区  ›  Devashish Dixit

如何在二进制编码文件中的不同记录之间添加分隔符?

  •  1
  • Devashish Dixit  · 技术社区  · 6 年前

    我有以下内容 struct

    struct Employee {
        id: u64,
        name: String,
    }
    

    我正在使用以下代码对其进行序列化,然后将序列化的字节数组写入文件:

    let emp = Employee {
        id: 1546,
        name: "abcd".to_string(),
    };
    
    let mut file = OpenOptions::new()
        .read(true)
        .write(true)
        .create(true)
        .open("hello.txt")
        .unwrap();
    
    let initial_buf = &bincode::serialize(&emp).unwrap();
    
    println!("Initial Buf: {:?}", initial_buf);
    
    file.write(&initial_buf);
    file.write(&[b'\n']);
    file.flush();
    
    file.seek(SeekFrom::Start(0)).unwrap();
    
    let mut final_buf: Vec<u8> = Vec::new();
    
    let mut reader = BufReader::new(file);
    
    reader.read_until(b'\n', &mut final_buf).unwrap();
    
    println!("Final Buf: {:?}", final_buf);
    

    我得到以下输出:

    Initial Buf: [10, 6, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 97, 98, 99, 100]
    Final Buf: [10]
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   dtolnay    6 年前

    Bincode的约定是,您给它一个要序列化的值,然后它返回字节。合同不能保证返回的字节不能包含换行符。

    在数据中,整数1546是0x60A,表示为字节 [10, 6, 0, 0]

    您应该能够在没有任何分隔符的情况下使用二进制码数据。这个 bincode::deserialize_from 函数将知道在哪里停止读取。