Perl 我有十六进制转储中的数据,但不';我不知道编码。例如0x91 0x05=657
我在hextump代码中有一些数据。 左手是DEC,右手是hexdump代码Perl 我有十六进制转储中的数据,但不';我不知道编码。例如0x91 0x05=657,perl,encoding,character-encoding,decode,hexdump,Perl,Encoding,Character Encoding,Decode,Hexdump,我在hextump代码中有一些数据。 左手是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 如何计算到12月的任何十六进制转储? 在perl中,我尝试使用ord()命令,但不起作用 更新 我不知道它叫什么。它看起来像它的数据。我尝试在excel中构建公式,如下所示: DEC = hex2dec(X) + (128^1 *
16 = 10
51 = 33
164 = A4 01
388 = 84 03
570 = BA 04
657 = 91 05
1025 = 81 08
246172 = 9C 83 0F
如何计算到12月的任何十六进制转储?
在perl中,我尝试使用ord()命令,但不起作用
更新
我不知道它叫什么。它看起来像它的数据。我尝试在excel中构建公式,如下所示:
DEC = hex2dec(X) + (128^1 * hex2dec(Y-1)) + (128^2 * hex2dec(Z-1)) + ...
您拥有的是可变长度编码。长度使用sentinel值的形式进行编码:编码数字的每个字节(最后一个字节除外)都设置了高位。其余的位以小的结束字节顺序形成数字的两位补码编码
0xxxxxxx⇒ 0xxxxxxx
1xxxxxxx 0YYYYYY⇒ 00yyyyyyyxxxxxx
1xxxxxxx 1yyyyyyy 0zzzzz⇒ 000zzzzz zzyyyyyy yxxxxxx
等
以下内容可用于解码流:
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);
您拥有的是可变长度编码。长度使用sentinel值的形式进行编码:编码数字的每个字节(最后一个字节除外)都设置了高位。其余的位以小的结束字节顺序形成数字的两位补码编码
0xxxxxxx⇒ 0xxxxxxx
1xxxxxxx 0YYYYYY⇒ 00yyyyyyyxxxxxx
1xxxxxxx 1yyyyyyy 0zzzzz⇒ 000zzzzz zzyyyyyy yxxxxxx
等
以下内容可用于解码流:
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);
164=0xa4,不是0xA401,也不是0x01A4(以防您将其设置为little endian)。其余的大部分转换都有问题。可能重复的转换不是正常的hex2dec转换。我想这是计算机代码。当DEC值大于128时,它的末尾有01。我猜任何设置了高字节的字节都表示后面有另一个字节。主要是一种可变长度编码,与UTF-8没有什么不同。因此,我假设这个数字是所有字节
&0x7f
的和*0x80**index
,直到遇到一个未设置位8的字节。与Excel公式非常相似,不同的是不是-1
,而是-128
。将Excel公式转换为Perl留给读者作为练习。164=0xa4,而不是0xA401,也不是0x01A4(以防您使用little endian)。其余的大部分转换都有问题。可能重复的转换不是正常的hex2dec转换。我想这是计算机代码。当DEC值大于128时,它的末尾有01。我猜任何设置了高字节的字节都表示后面有另一个字节。主要是一种可变长度编码,与UTF-8没有什么不同。因此,我假设这个数字是所有字节&0x7f
的和*0x80**index
,直到遇到一个未设置位8的字节。与Excel公式非常相似,不同的是不是-1
,而是-128
。将Excel公式转换为Perl留给读者作为练习。与UTF-8的不同之处在于:UTF-8使用长度前缀而不是前哨值,它使用大的结束字节顺序,并且它“浪费”位以使查找成为可能。与UTF-8一样,这种格式有多种编码相同数字的方法。例如,一个可以被编码为01
,81 00
,81 80 00
,81 80 00
,等等。UTF-8认为“过长”编码是非法的。我也在找工作。你能再举个例子吗?我的数据由一些字节分隔,并以串行/流的形式显示。例如,08 XX XX 10 YY YY 20 ZZ ZZ ZZ ZZ 30
有时XX XX可以是10的值,搜索将无效。我的意思是,如果你搜索到编码数字的中间,你可以找到数字的结尾。假设您知道您正在搜索一个编码的数字(例如,如果文件完全由编码的数字组成)。如果你想要帮助解决你的问题,问一个问题。请确保提供更清晰、更全面的信息。与UTF-8的不同之处在于:UTF-8使用长度前缀而不是前哨值,它使用大的结束字节顺序,并且它“浪费”位以使查找成为可能。与UTF-8一样,这种格式有多种编码相同数字的方式。例如,一个可以被编码为01
,81 00
,81 80 00
,81 80 00
,等等。UTF-8认为“过长”编码是非法的。我也在找工作。你能再举个例子吗?我的数据由一些字节分隔,并以串行/流的形式显示。例如,08 XX XX 10 YY YY 20 ZZ ZZ ZZ ZZ 30
有时XX XX可以是10的值,搜索将无效。我的意思是,如果你搜索到编码数字的中间,你可以找到数字的结尾。假设您知道您正在搜索一个编码的数字(例如,如果文件完全由编码的数字组成)。如果你想要帮助解决你的问题,问一个问题。确保提供更清晰、更全面的信息。