Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 我有十六进制转储中的数据,但不';我不知道编码。例如0x91 0x05=657_Perl_Encoding_Character Encoding_Decode_Hexdump - Fatal编程技术网

Perl 我有十六进制转储中的数据,但不';我不知道编码。例如0x91 0x05=657

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 *

我在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 * 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的值,搜索将无效。我的意思是,如果你搜索到编码数字的中间,你可以找到数字的结尾。假设您知道您正在搜索一个编码的数字(例如,如果文件完全由编码的数字组成)。如果你想要帮助解决你的问题,问一个问题。确保提供更清晰、更全面的信息。