基于@ebux 的回答:
前 4 个字节是数字的组成部分,以一种稍微奇怪的方式编码......第一个字节的 UPPER 半字节是数字本身。其他 5 个半字节是 0 表示正数,f 表示负数以“通常”的方式。
其余的字符串,就像@ebux 所说的那样,是值的浮点部分,采用 IEEE 格式,但是在编码/解码它们时,您必须向二进制字符串添加/删除两个 \0 字节。
这个 perl 程序将解码一个包含您的示例的文件:
#!/usr/bin/perl
use MIME::Base64 qw(decode_base64 encode_base64);
while (<>) {
chomp;
y/\r//d;
s/- /-/;
s/^\s+//;
($a, $b, $c)=split();
$a2=decode_base64(substr($b, 0, 4));
$b2=substr(decode_base64(substr($b, 2)), 2);
$c2=substr(decode_base64($c), 0, 4);
printf("%10s", $a);
print "\t"; printhex($a2);
print "\t"; printhex($b2);
print "\t"; printhex($c2);
print "\t"; printint($a2);
print "\t"; printdbl($b2.$c2);
print "\n";
}
sub printhex {
my $str=shift;
for ($i=0; $i<length($str); $i++) {
printf("%02x.", ord(substr($str, $i, 1)));
}
}
sub printint {
my $str=shift;
my $val=ord(substr($str, 0, 1))>>4;
$val-=16 if (substr($str, 1, 1) eq "\xff");
printf("%5d", $val);
}
sub printdbl {
my $str=shift;
my $val=unpack("d", $str);
printf("%10.4f", $val);
}
输出(列顺序是您的列,从 base64 字符串派生的 3 列十六进制字节,从 col1 派生的整数值,从 col2/3 派生的浮点值):
2.01 20.00.00. 14.ae.47.e1. 7a.14.00.40. 2 2.0100
0 00.00.00. 00.00.00.00. 00.00.00.00. 0 0.0000
0.01 00.00.00. 7b.14.ae.47. e1.7a.84.3f. 0 0.0100
0.02 00.00.00. 7b.14.ae.47. e1.7a.94.3f. 0 0.0200
0.03 00.00.00. b8.1e.85.eb. 51.b8.9e.3f. 0 0.0300
1 10.00.00. 00.00.00.00. 00.00.f0.3f. 1 1.0000
2 20.00.00. 00.00.00.00. 00.00.00.40. 2 2.0000
3 30.00.00. 00.00.00.00. 00.00.08.40. 3 3.0000
4 40.00.00. 00.00.00.00. 00.00.10.40. 4 4.0000
5 50.00.00. 00.00.00.00. 00.00.14.40. 5 5.0000
6 60.00.00. 00.00.00.00. 00.00.18.40. 6 6.0000
7 70.00.00. 00.00.00.00. 00.00.1c.40. 7 7.0000
8 80.00.00. 00.00.00.00. 00.00.20.40. 8 8.0000
9 90.00.00. 00.00.00.00. 00.00.22.40. 9 9.0000
10 a0.00.00. 00.00.00.00. 00.00.24.40. 10 10.0000
11 b0.00.00. 00.00.00.00. 00.00.26.40. 11 11.0000
12 c0.00.00. 00.00.00.00. 00.00.28.40. 12 12.0000
-12 4f.ff.ff. 00.00.00.00. 00.00.28.c0. -12 -12.0000
-1 ff.ff.ff. 00.00.00.00. 00.00.f0.bf. -1 -1.0000
-0.64 ff.ff.ff. 7b.14.ae.47. e1.7a.e4.bf. -1 -0.6400
2.01 20.00.00. 14.ae.47.e1. 7a.14.00.40. 2 2.0100
该程序将一个或多个数字转换为您的格式:
#!/usr/bin/perl
use MIME::Base64 qw(decode_base64 encode_base64);
foreach $a (@ARGV) {
print $a;
my $intpart=($a & 0x0f) << 4;
if ($a<0) {
$intpart|=0xffffff0f;
}
my $part1=encode_base64(pack("l", $intpart)); chomp $part1;
# print "\t", $part1;
my $temp=encode_base64("\x00\x00".pack("d", $a)); chomp $temp;
# print "\t", $temp;
my $part2=substr($part1, 0, 4).substr($temp, 2, 6);
print "\t", $part2;
my $part3=substr($temp, 8, 6)."AA";
print "\t", $part3;
print "\n";
}
例子:
$ perl encode.pl 0.01 0.02 0.03 2.01 0 11 12 -12 -1
0.01 AAAAB7FK5H 4XqEPwAA
0.02 AAAAB7FK5H 4XqUPwAA
0.03 AAAAC4HoXr UbiePwAA
2.01 IAAAAUrkfh ehQAQAAA
0 AAAAAAAAAA AAAAAAAA
11 sAAAAAAAAA AAAmQAAA
12 wAAAAAAAAA AAAoQAAA
-12 T///AAAAAA AAAowAAA
-1 ////AAAAAA AADwvwAA
这是从 -12 到 12 的所有数字的链接:
https://mega.nz/#!BVpWgBiI!aPbtMmMYnLgUUn011Cl5qjA5OO6TpKG8CSTIhR7Re0E