我有一个YAML文件,其中包含编码和解码元素的测试用例,这些测试用例保证是正确的。左侧表示预期的编码字节,右侧包含原始数字。对于VarInts,测试用例是:
examples:
"\0": 0
"\u0001": 1
"\u000A": 10
"\u00c8\u0001": 200
"\u00e8\u0007": 1000
"\u00a9\u0046": 9001
"\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u00ff\u0001": -1
前三个示例在解释为无符号数字时可以正常工作。但是,第四个示例(200)及后续示例无法生成正确的结果。
具体到200,我有以下可重复性最低的示例:
use bytes::{Buf, BufMut};
use integer_encoding::{VarIntReader, VarIntWriter, VarInt};
let value = "\u{00c8}\u{0001}";
// "È\u{1}"
println!("Expected encoded number as a string: {:?}", value);
let mut buf: &[u8] = value.as_bytes();
// [195, 136, 1]
println!("Expected encoded number as a byte array: {:?}", buf);
let num_as_i32: i32 = 200;
let mut wr = vec![].writer();
wr.write_varint(num_as_i32);
let encoded_result_as_i32: Vec<u8> = wr.into_inner();
// [144, 3]
println!("Encoded result as i32: {:?}", encoded_result_as_i32);
let num_as_u32: u32 = 200;
let mut wr2 = vec![].writer();
wr2.write_varint(num_as_u32);
let encoded_result_as_u32: Vec<u8> = wr2.into_inner();
// [200, 1]
println!("Encoded result as u32: {:?}", encoded_result_as_u32);
结果[200,1]似乎是有意义的,因为它匹配十六进制值“\u00c8\u0001”,但它不匹配假定的预期值[195,136,1]。
根据protobuf VarInt引用,最后一个示例(-1)应该被编码为1,所以我似乎也遗漏了一些东西。
期望编码值的字符串解释是否有问题?或者编码过程中是否缺少某些东西?
1条答案
按热度按时间dfddblmv1#
这里的问题是“\u00c8\u0001”需要作为字节数组[200,1]读取,而不是UTF-8字符串,后者会被错误地解释为[195,136,1]。
编码本身是正确的,解决方案是正确读取编码而不允许将其转换为UTF-8,或者允许将其转换为UTF-8并在可能的情况下将其还原为正确的字节数组。
作为一个单独的问题会更合适,所以我关闭这个问题。感谢@cafce25的帮助!
编辑:solution