|
|

分享源码
| 界面截图: |
|
| 是否带模块: |
纯源码 |
| 备注说明: |
- |
本帖最后由 不知道 于 2025-12-29 14:08 编辑
白菜跨语言数据类型封包与解包标准
简介
~AI的崛起,或许需要的是万物互联吧;
目前提供了易语言和PHP实现作为参考示例(它是一个设计标准,不局限于语言本身),旨在提供一套简单高效、跨语言的数据封包(FB)与解包(deFB)方案,便于在对数据进行统一的二进制参数级交互(封包中无需存档额外元信息)
- 支持基本数据类型(singned/unsigned char/short/int/int64,bool,float/double)
- 支持字符串,字节集(String,Bytes)
- 支持数组(包含以上基本类型,及其下面结构体数组)
- 支持结构体(对象序列化/反序列化,嵌套结构体/结构体数组)
设计标准参考
https://wiki.xbcsoft.com/BC-FB-Standard
代码仓库
https://github.com/xbcsoft/BC-FB-Standard
快速示例(PHP)
<?php
include 'FB.php';
// 准备数据
$a = 123; //int
$b = 'hello'; //string
// 生成打包(FB 将把字段编码为二进制格式)
$fb = FB(i16($a), $b);
// 输出打包的可读形式(解字节集十进制视图)
echo "FB bytes: " . jzjj($fb) . "\n";
// 解包示例(将打包数据还原到所有变量,需提前给定反射类型—脚本语言这里可用特定初值表示)
$out_a = T_short;
$out_b = T_String;
deFB($fb, $out_a, $out_b);
echo "解包结果:a={$out_a}, b={$out_b}\n";
// 解包示例(对按索引读取)
$first = gFB($fb, 0); //取第一个参数(按字节集)
echo "参数1(原始):" .jzjj($first). "\n";
$first_int = gFBi($fb, 0); //取第一个参数(按整数)
echo "参数1(整型):" .$first_int. "\n";
$second = gFB($fb, 1); //取第二个参数
echo "参数2:" .$second. "\n";
解包结果:a=123, b=hello
参数1(原始):Bytes:2{123,0}
参数1(整型):123
参数2:hello
数组、结构体更多示例请参考:
https://wiki.xbcsoft.com/BC-FB-Standard/?file=3.0_打包数据类型的存储结构.html
https://wiki.xbcsoft.com/BC-FB-Standard/?file=4.0_结构体对象的打包方案.html
快速示例(易语言)
| 窗口程序集名 | 保 留 | 保 留 | 备 注 | | 窗口程序集_启动窗口 | | | | TEST_基本数据类型 () | 变量名 | 类 型 | 静态 | 数组 | 备 注 | | char | 字节型 | | | | bool | 逻辑型 | | | | short | 短整数型 | | | | int | 整数型 | | | | int64 | 长整数型 | | | | float | 小数型 | | | | double | 双精度小数型 | | | | string | 文本型 | | | | bytes | 字节集 | | | | fb | 字节集 | | | 连续赋值 (1, char, short, int, float, double )bool = 真 int64 = 274877906943 bytes = 到字节集 (“world”)fb = FB (char, short, int, int64, float, double, “hello”, bytes, bool ) 调试输出 (fb )调试输出 (gFBi (fb, 0 ), gFBi (fb, 1 ), gFBi (fb, 2 ), gFBl (fb, 3 ), gFBf (fb, 4 ), gFBf (fb, 5 )) 调试输出 (gFBs (fb, 6 ), gFB (fb, 7 )) 调试输出 (gFBb (fb, 8 ), gFB (fb, 8 )) 连续赋值 (0, char, short, int, float, double, int64 ) bool = 假 string = “”bytes = { }deFB (fb, char, short, int, int64, float, double, string, bytes, bool )调试输出 (“——————————————————————————————————”)调试输出 (char, short, int, int64, float, double )调试输出 (string, bytes )调试输出 (bool )| 变量名 | 类 型 | 静态 | 数组 | 备 注 | | charArr | 字节型 | | 3 | | boolArr | 逻辑型 | | 3 | | shortArr | 短整数型 | | 3 | | intArr | 整数型 | | 3 | | int64Arr | 长整数型 | | 3 | | floatArr | 小数型 | | 3 | | doubleArr | 双精度小数型 | | 3 | | stringArr | 文本型 | | 3 | | bytesArr | 字节集 | | 3 | | fb | 字节集 | | |
fb = FB (charArr, boolArr )调试输出 (fb ) shortArr = { 111, 2222 } fb = FB (shortArr, { 123, 4567, 89101112, 666, 77 }) 连续赋值 ({ }, shortArr, intArr ) deFB (fb, shortArr, intArr )调试输出 (shortArr, intArr )stringArr [1 ] = “aaaaa”stringArr [2 ] = “bb”stringArr [3 ] = “cccc”bytesArr [2 ] = 到字节集 (“hello world”)fb = FB (stringArr, bytesArr )清除数组 (stringArr )deFB (fb, stringArr )调试输出 (stringArr, bytesArr )
复合结构体嵌套示例(易语言)
| 窗口程序集名 | 保 留 | 保 留 | 备 注 | | 窗口程序集_启动窗口 | | | | 子程序_TESTA () | 变量名 | 类 型 | 静态 | 数组 | 备 注 | | o | A | | | | dat | 字节集 | | | | o_ | A | | |
o.a = 123 o.b = “hello”dat = FB_A (o )调试输出 (dat )deFB_A (pFB (dat ), o_ )调试输出 (o_.a, o_.b )| 变量名 | 类 型 | 静态 | 数组 | 备 注 | | o | B | | | | a | 字节集 | | 0 | | fb | 字节集 | | | | o_bb | 字节集 | | 0 | | p_aa | 子程序指针 | | | | p | 整数型 | | | | o_ | B | | |
o.aa.a = 123666 o.aa.b = “你好”o.bb [1 ] = 到字节集 (“hello”)fb = FB_B (o )deFB_B (pFB (fb ), o_ )调试输出 (o_.aa.a, o_.aa.b, o_.bb )| 变量名 | 类 型 | 静态 | 数组 | 备 注 | | o | C | | | | fb | 字节集 | | | | o_ | C | | | 重定义数组 (o.bbb, 假, 3 ) o.aaa [1 ].a = 123 o.aaa [1 ].b = “你是真的6”o.bbb [1 ].aa.a = 12306 o.bbb [1 ].aa.b = “你好啊”o.bbb [1 ].bb [1 ] = 到字节集 (“hello”)fb = FB_C (o ) deFB_C (pFB (fb ), o_ )调试输出 (o_.aaa [1 ].a, o_.aaa [1 ].b )调试输出 (o_.bbb [1 ].aa.a, o_.bbb [1 ].aa.b )调试输出 (o_.bbb ) 调试输出 (o_.bbb [1 ].bb )
PS:源码中使用上了支持库,原因是只有支持库才能提供必需的基础类型反射,不过源码中已包含支持库源码可放心食用(有能力可以自行编译,此外易语言静态库没打包在里头,可加我群里免费获得)
最后欢迎加群讨论【白易语言研究院】:Q群668536886
|
|