3

私は基本的に、バイナリ文字列をバイトの配列/リストに変換したかったのです(インデックスを作成できるようにし、構文が複雑になるため、使用を避けるため)、次のsubstrMWEを思いつきました:

#!/usr/bin/env perl

use warnings;
use strict;

# Use open ':raw';      # Unknown PerlIO layer class ':raw'
use open IO => ':raw';

binmode(STDIN);
binmode(STDOUT);

# Create original 8-bit byte array/list
my @atmp = (0x80, 0x23, 0x14, 0x0d, 0x0a, 0x00, 0x00, 0x80, 0x43, 0x00, 0x00);

# Make a copy of portion
my @atmp2 = (0) x 2;
@atmp2[0..1] = @atmp[7..8];

# Print output
print "Copied atmp2 contents as hex: " . join(", ", unpack("H2"x2, pack("C"x2,@atmp2))) . "\n";
print "Copied atmp2 as ushort (16bit) int: " . unpack("S", pack("C"x2, @atmp2));
# doublecheck value by routing through printf with format specifier:
printf(" [%d]\n", unpack("S", pack("C"x2, @atmp2)));


# Now, the same data as string:
my $indata = "\x80\x23\x14\x0d\x0a\x00\x00\x80\x43\x00\x00";

# Create byte array (by converting string $indata to array/list with `split`)
my @btmp = split('',$indata);
print "lastindex: " . $#btmp . "\n";

# Make a copy of portion
my @btmp2 = (0) x 2;
@btmp2[0..1] = @btmp[7..8];

# Print output
print "Copied btmp2 contents as hex: " . join(", ", unpack("H2"x2, pack("C"x2,@btmp2))) . "\n";
print "Copied btmp2 as ushort (16bit) int: " . unpack("S", pack("C"x2, @btmp2));
# doublecheck value by routing through printf with format specifier:
printf(" [%d]\n", unpack("S", pack("C"x2, @btmp2)));

このコードを実行すると、次の結果が得られます。

$ perl test.pl
Copied atmp2 contents as hex: 80, 43
Copied atmp2 as ushort (16bit) int: 17280 [17280]
lastindex: 10
Argument "M-\0" isn't numeric in pack at test.pl line 38.
Argument "C" isn't numeric in pack at test.pl line 38.
Copied btmp2 contents as hex: 00, 00
Copied btmp2 as ushort (16bit) int: 0 [0]

2 番目の部分 (btmp2) を最初の部分 (atmp2) と同じように動作させるにはどうすればよいですか?

4

1 に答える 1

5

を使用するsplitと、実際には元の文字列と同じバイトの配列が作成されます。ただし、結果の配列を何らかの形で「テキスト」としてマークしているようにも見えるため、それ以降の処理は「数値ではない引数」で失敗します。

答えは、代わりにsplitを使用する行に単純に置き換えることです。unpack

- my @btmp = split('',$indata);
+ my @btmp = unpack('C*',$indata);

...そしてその後、すべてが期待どおりに機能します(両方の印刷物は同じです)。興味深いことに、どちらの場合も、「lastindex」(文字列から派生した配列の場合) は 10 と表示されます (これにより、 に何か問題がある可能性があると思いましたbinmode。これが、これらすべてのステートメントがコード内にある理由です)。

于 2012-10-31T13:24:47.377 に答える