#nan #payload #steganography #float

ananas

将任意数据转换为非数字(NaN)有效载荷

2个不稳定版本

0.2.0 2021年7月25日
0.1.0 2021年7月24日

#1106 in 编码

无许可

8KB
108

ananas

🍍 将任意字节放入你的NaN中!🍍

正如维基百科解释的,

例如,位运算IEEE 754单精度(32位)NaN将是

s11111111xxx xxxx xxxx xxxx xxxx xxxx

其中s是符号(在应用中通常被忽略)而x序列表示一个非零数字(值零表示无穷大)。x的最高位用于确定NaN的类型:“安静NaN”或“信号NaN”。 其余位用于编码有效载荷(在应用中通常被忽略)。

--- NaN,维基百科(2021)(强调是我的)

NaN有效载荷不再被忽略!使用ananas,你可以给你的NaN赋予全新的意义。顺便说一句,“ananas”是法语中的菠萝 🍍,你不写ananas就不能没有NaN。

NaN有一个(被忽略)的符号为0或1,指数为全1和尾数。尾数的第一个位确定NaN是信号还是安静的。其余22位可以设置为任何东西,除了0。我们定义我们的特殊NaN如下,

i111 1111 1s1nn 0000 xxxx xxxx xxxx xxxx

其中 i 是符号(被忽略),s 是信号位,n 是编码字节的标记,x 是我们的有效载荷。中间的0000是未使用的。

示例

我们可以将任意字节放入NaN中,编码为f32。每个f32数字存储两个字节,

// Encoding to NaNs
let s = "Hello, world!";
let x = ananas::bytes_to_nan(&s.as_bytes());
println!("{:?}", x); // prints '[NaN, NaN, NaN, NaN, NaN, NaN, NaN]'

// Decoding from NaNs
let y = String::from_utf8(ananas::nan_to_bytes(&x)).unwrap();
assert_eq!(y, s);

此软件包提供方便的字符串转换器。

NaN会被传播,这会保持有效载荷,

let x = ananas::str_to_nan("😎");
let y = [x[0] + 10000.0, x[1] / 0.0];
assert!(y[0].is_nan());
assert_eq!(ananas::nan_to_str(&y).unwrap(),  "😎");

当两个NaN相遇时,这可能会产生奇怪的行为,例如失去交换律,

let x1 = ananas::str_to_nan("nan nan nan nan");
let x2 = ananas::str_to_nan("batman! batman!");
let y1 :Vec<_> = x1.iter().zip(&x2).map(|(a,b)| a*b).collect();
let y2 :Vec<_> = x1.iter().zip(&x2).map(|(a,b)| b * a).collect();
println!("{:?}", ananas::nan_to_str(&y1)); // nan nan nan nan
println!("{:?}", ananas::nan_to_str(&y2)); // batman! batman!

安装

不清楚为什么你要麻烦,但可以通过添加以下代码到你的项目的 Cargo.toml 来导入ananas。

[dependencies]
ananas = 0.2.0

到你的项目的 Cargo.toml

用途

¯\_(ツ)_/¯

许可

此代码为公有领域,根据 Unlicense 的条款。

无运行时依赖