1 个不稳定版本
0.1.0 | 2020年6月21日 |
---|
#121 在 金融
68KB
1.5K SLoC
i8583
ISO8583金融事务消息打包和解包的类型、相关函数和规范。
在大多数实际情况下,IS08583消息被创建为通过TCP传输的应用层协议,因此所有接口都是字节数组 [u8]
,以便于与套接字一起使用。
依赖项
无
示例
包含两个示例,pack
和 unpack
,在crate根目录中运行以下命令执行。
$ cargo run --example pack
$ cargo run --example unpack
用法
解包ISO8583消息。
use i8583::v1987;
use i8583::Unpacker;
fn main() {
let response = "08002238000000800000000000070814102414102414102407082020XXXX";
let mut iso = Unpacker::new(response.as_bytes());
let fields = iso.unpack(&v1987::SPEC).unwrap();
for (i, field) in fields.iter().enumerate() {
if let Some(val) = field {
println!("[{:03}] {}", i, std::str::from_utf8(val).unwrap());
}
}
}
打包ISO8583消息。
use i8583::v1987;
use i8583::Packer;
fn main() {
let mut iso_packer = Packer::new(&v1987::SPEC);
if let Err(msg) = set_elements(&mut iso_packer) {
eprintln!("{}", msg);
return;
}
let iso = match iso_packer.pack(Vec::with_capacity(1024)) {
Ok(iso) => {
iso
}
Err(msg) => {
eprintln!("{}", msg);
return;
}
};
println!("{}", std::str::from_utf8(&iso).unwrap());
}
fn set_elements(iso_packer: &mut Packer) -> Result<(), String> {
let pan = String::from("454000000000003");
iso_packer.set_field(0, "0800".as_bytes().into())?;
iso_packer.set_field(2, pan.into_bytes().into())?;
iso_packer.set_field(3, "000000".as_bytes().into())?;
iso_packer.set_field(28, "D00000000".as_bytes().into())?;
iso_packer.set_field(11, "000001".as_bytes().into())?;
iso_packer.set_field(34, "12345".as_bytes().into())?;
iso_packer.set_field(41, "12345678".as_bytes().into())?;
iso_packer.set_field(42, "123456789012345".as_bytes().into())?;
iso_packer.set_field(12, "000000".as_bytes().into())?;
iso_packer.set_field(13, "0101".as_bytes().into())?;
iso_packer.set_field(14, "0505".as_bytes().into())?;
iso_packer.set_field(15, "0202".as_bytes().into())?;
iso_packer.set_field(60, "TEST DATA".as_bytes().into())?;
iso_packer.set_field(61, "LONGER TEST DATA".as_bytes().into())?;
iso_packer.set_field(
62,
"The quick brown fox jumped over the lazy dog"
.as_bytes()
.into(),
)?;
iso_packer.set_field(70, "301".as_bytes().into())?;
Ok(())
}
基准测试
使用以下命令运行基准测试。
$ rustup run nightly cargo bench
在macOS Catalina,2 GHz 双核英特尔酷睿i5,8 GB 1867 MHz LPDDR3上的输出。
test pack_unpack_benchmark ... bench: 1,129 ns/iter (+/- 155)
test set_pack_unpack_benchmark ... bench: 3,037 ns/iter (+/- 245)
test unpack_benchmark ... bench: 285 ns/iter (+/- 30)