ต้อ*_*มัย 0 perl encoding hexdump decode character-encoding
我在hexdump代码中有一些数据.左手是DEC,右手是hexdump代码.
16 = 10
51 = 33
164 = A4 01
388 = 84 03
570 = BA 04
657 = 91 05
1025 = 81 08
246172 = 9C 83 0F
Run Code Online (Sandbox Code Playgroud)
如何计算到DEC的任何hexdump?在perl中,我尝试使用ord()命令但不起作用.
更新 我不知道它叫什么.它看起来像7bits数据.我尝试在excel中构建公式,如下所示:
DEC = hex2dec(X) + (128^1 * hex2dec(Y-1)) + (128^2 * hex2dec(Z-1)) + ...
Run Code Online (Sandbox Code Playgroud)
你有一个可变长度编码.使用sentinel值的形式对长度进行编码:除了last之外的编码数字的每个字节都设置了高位.其余的位以小端字节顺序形成数字的二进制补码编码.
0xxxxxxx ? 0xxxxxxx
1xxxxxxx 0yyyyyyy ? 00yyyyyy yxxxxxxx
1xxxxxxx 1yyyyyyy 0zzzzzzz ? 000zzzzz zzyyyyyy yxxxxxxx
etc
Run Code Online (Sandbox Code Playgroud)
以下内容可用于解码流:
use strict;
use warnings;
use feature qw( say );
sub extract_first_num {
$_[0] =~ s/^([\x80-\xFF]*[\x00-\x7F])//
or return;
my $encoded_num = $1;
my $num = 0;
for (reverse unpack 'C*', $encoded_num) {
$num = ( $num << 7 ) | ( $_ & 0x7F );
}
return $num;
}
my $stream_buf = "\x10\x33\xA4\x01\x84\x03\xBA\x04\x91\x05\x81\x08\x9C\x83\x0F";
while ( my ($num) = extract_first_num($stream_buf) ) {
say $num;
}
die("Bad data") if length($stream_buf);
Run Code Online (Sandbox Code Playgroud)
输出:
16
51
164
388
570
657
1025
246172
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
87 次 |
最近记录: |