11个版本
使用旧的Rust 2015
0.3.1 | 2021年5月16日 |
---|---|
0.3.0 | 2019年6月14日 |
0.2.2 | 2019年3月7日 |
0.2.1 | 2019年2月12日 |
0.1.5 | 2019年1月30日 |
#1183 in 编码
32 每月下载次数
45KB
796 行
bibicode
Bibicode是一个crate和应用程序,可以将任何自然数从一种数制转换为另一种数制。
必须定义两种数制
- 一个用于输入数字
- 另一个用于输出。
然后可以转换任何长度为自然数(从一种数制到另一种数制,反之亦然)。
这个库使用移位调整算法(以及反向移位调整)来转换数字。以二进制作为基准数。这种方法在这里有描述: 将二进制数字转换为任何基数。
它是以法国歌手(也是数学家)Boby Lapointe的名字命名的,他在1968年发明了Bibi二进制系统。
以下数制已预先集成到应用程序中,并可供使用
- dec表示十进制
- hex表示十六进制
- bin表示二进制
- base58表示58进制,用于比特币地址表示
- bibi表示Bibi二进制,由Boby Lapointe定义,是该应用程序的灵感来源
- budu表示一种可读性良好的实验性数制
- utf8表示一种实验性数制,它是几个utf8符号的组合
- chin表示一种使用中文字符的实验性数制
示例:使用crate
extern crate bibicode;
let dec = bibicode::NumeralSystem::new("", vec!(vec!("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"))).unwrap();
let bibi = bibicode::NumeralSystem::new("", vec!(vec!("HO", "HA", "HE", "HI", "BO", "BA", "BE", "BI", "KO", "KA", "KE", "KI", "DO", "DA", "DE", ))).unwrap();
let coder = bibicode::BibiCoder::new(dec, bibi);
let test = coder.swap("2000").unwrap();
assert_eq!(test, "BIDAHO");
let bibi = bibicode::NumeralSystem::new("", vec!(vec!("H", "B", "K", "D"), vec!("O", "A", "E", "I"))).unwrap();
let dec = bibicode::NumeralSystem::new("", vec!(vec!("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"))).unwrap();
let coder = bibicode::BibiCoder::new(dec, bibi);
let test = coder.swap("2000").unwrap();
assert_eq!(test, "BIDAHO");
// with prefixed numeral system
let dec = bibicode::NumeralSystem::new("", vec!(vec!("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"))).unwrap();
let hex = bibicode::NumeralSystem::new("0x", vec!(vec!("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"))).unwrap();
let coder = bibicode::BibiCoder::new(dec, hex);
let test = coder.swap("2000").unwrap();
assert_eq!(test, "0x7d0");
let dec = bibicode::NumeralSystem::new("", vec!(vec!("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"))).unwrap();
let hex = bibicode::NumeralSystem::new("0x", vec!(vec!("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"))).unwrap();
let coder = bibicode::BibiCoder::new(hex, dec);
let test = coder.swap("0x7d0").unwrap();
assert_eq!(test, "2000");
// will also work
let test = coder.swap("7d0").unwrap();
assert_eq!(test, "2000");
示例:使用应用程序
$ cargo install
...
$ bibicode 1111111111111111 -f bin -t hex
0xffff
$ bibicode 1111111111111111 100100010100000001 -f bin -t hex
0xffff 0x24501
$ bibicode ffff -t bin -f hex
0b1111111111111111
$ bibicode ffffffffffffffffffffffffffffffff -t dec -f hex
340282366920938463463374607431768211455
$ bibicode 340282366920938463463374607431768211455 -f dec -t hex
0xffffffffffffffffffffffffffffffff
$ bibicode 5454366920938463463375407431768211455 -f dec -t utf8
■♢♥♢♥♤♣♧★○■☆♠◇♥♧♠♡♣♤♠⚐♦♡■⚐♥♤◀⚐♣◇●◁◀♡♦♢
$ bibicode 5454366920938463463375407431768211455 -f dec -t chin
㑈㹨㕫㕃㽃㹼㷶㓱㸿㰪㯿
数制可以由一个json文件表示
$ cat ./examples/bibi.json
{
"digits":["HO", "HA", "HE", "HI", "BO", "BA", "BE", "BI", "KO",
"KA", "KE", "KI", "DO", "DA", "DE", "DI"]
}
$ bibicode 340282366920938463463374607431768211455 -f dec -t ./examples/bibi.json
DIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDI
$ bibicode 5454366920938463463375407431768211455 -f dec -t ./examples/bibi.json
BOHAKEBIKAHODAHIKADIDEDAKAKOBOKOHADIBEDADOBEHOKOHIDAHADIDIDIDI
$ cat ./examples/budu.json
{
"digits": [["B","K","D","F","G","J","L","M","N","P","R","S","T","V","X","Z"], ["a", "i","o","u"]]
}
$ bibicode 5454366920938463463375407431768211455 -f dec -t ./examples/budu.json
KaKoPuPaFiFoMuXuLiNiDaKuVoVuKoBoBuVaMuZuZu
可以使用前缀来标记输出数字
$ cat ./examples/hex.json
{
"prefix":"0x",
"digits":["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"]
}
$ bibicode 340282366920938463463374607431768211455 -f dec -t ./examples/hex.json
0xffffffffffffffffffffffffffffffff
数制json文件可以存储在与应用程序链接的XDG目录中。如果是这样,bibicode可以直接根据json文件的名称知道数制。
$ cat ~/.local/share/bibicode/budu2.json
{
"digits": [["B","K","D","F","G","J","L","M","N","P","R","S","T","V","X","Z"], ["a", "i","o","u"]]
}
$ bibicode 5454366920938463463375407431768211455 -f dec -t budu2
KaKoPuPaFiFoMuXuLiNiDaKuVoVuKoBoBuVaMuZuZu
默认情况下,如果没有指定,将使用十进制系统。然而,bibicode将尝试从第一个输入数字的前缀猜测数字系统。
$ bibicode 5454366920938463463375407431768211455 -f dec -t hex
0x41a790d39fed98481f6dc6083d1ffff
$ # use default dec as input :
$ bibicode 5454366920938463463375407431768211455 -t hex
0x41a790d39fed98481f6dc6083d1ffff
$ cat ~/.local/share/bibicode/budu.json
{
"prefix": "budu-",
"digits": [["B","K","D","F","G","J","L","M","N","P","R","S","T","V","X","Z"], ["a", "i","o","u"]]
}
$ # will use budu as input (because of the prefix) and default dec as output
$ bibicode budu-KaKoPuPaFiFoMuXuLiNiDaKuVoVuKoBoBuVaMuZuZu
5454366920938463463375407431768211455
$ bibicode 5454366920938463463375407431768211455 -t budu
budu-KaKoPuPaFiFoMuXuLiNiDaKuVoVuKoBoBuVaMuZuZu
可以使用连接选项将输入上的多个数字连接起来。
$ bibicode 324443242 76575432423 -f dec -t hex
0x13569c6a 0x11d4405ee7
$ bibicode 324443242 76575432423 -f dec -t hex --concat
0x13569c6a11d4405ee7
可以向bibicode提供正则表达式来描述数字的格式。
示例:将比特币地址转换为十进制(第一个字节是版本号)
$ cat ./examples/base58.json
{
"digits": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
}
$ bibicode 17VZNX1SN5NtKa8UQFxwQbFeFc3iqRYhem -f ./examples/base58.json -t dec --regex "^(\\d{1})([1-9A-HJ-NP-Za-km-z]*)$"
0 1746223458145969276700901827421233769953772985502309560518
使用 --concat 选项连接输出
$ bibicode 17VZNX1SN5NtKa8UQFxwQbFeFc3iqRYhem -f ./examples/base58.json -t dec --regex "^(\\d{1})([1-9A-HJ-NP-Za-km-z]*)$" --concat
01746223458145969276700901827421233769953772985502309560518
和反转操作
$ bibicode 01746223458145969276700901827421233769953772985502309560518 -f dec -t ./examples/base58.json --regex "^(\\d{1})(\\d{58})$"
17VZNX1SN5NtKa8UQFxwQbFeFc3iqRYhem
可以直接将通用前缀、分隔符和后缀提供给bibicode的输出。
示例:交换HTML RGB颜色与十六进制
$ cat ./examples/hexcol.json
{
"prefix":"#",
"digits":["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"]
}
$ bibicode "#e135ad" -f ./examples/hexcol.json -t dec -s "," -p "rgb(" -x ")" -r "([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})"
rgb(225,53,173)
$ bibicode "rgb(225,53,173)" -f dec -t ./examples/hexcol.json -r "^rgb\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3})\\)$" --concat
#e135ad
依赖项
~4.5–6.5MB
~113K SLoC