#解包 #打包 #消息 #ISO8583 #事务 #规范

i8583

ISO8583金融事务消息打包和解包的类型、相关函数和规范

1 个不稳定版本

0.1.0 2020年6月21日

#121金融

MIT 许可证

68KB
1.5K SLoC

i8583

ISO8583金融事务消息打包和解包的类型、相关函数和规范。

在大多数实际情况下,IS08583消息被创建为通过TCP传输的应用层协议,因此所有接口都是字节数组 [u8],以便于与套接字一起使用。

依赖项

示例

包含两个示例,packunpack,在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)

无运行时依赖