2017-04-05 1 views
2

Perl에서 이진 데이터를 바이트로 언팩하기 위해 unpack() 함수를 사용하고 있습니다. $thing->{_raw} 이진 데이터와 단지 문자열입니다for 루프가없는 unpack()

my $lenOverHead = 3; 
my $lenWithoutOverheads = length($thing->{_raw}) - $lenOverHead; 

my @AA; 
for (my $i = 0; $i < $lenWithoutOverheads; $i++) 
{ 
    push (@AA, unpack('C', substr($thing->{_raw}, $lenOverHead+$i))); 
} 

참고 : 지금까지 나는 이것을 얻었다.

이제는 for 루프를 사용하지 않고도 map() 또는 이와 비슷한 방법으로 더 나은 (더 효율적인)/더 좋은 방법이 있습니까?

my @BB = map { unpack('C', $_) } substr($thing->{_raw}, $lenOverHead); 

그러나 물론 그것은 단지 첫 번째 바이트가 아닌 그들 모두의 압축을 풉니 다 ....

답변

6

난 당신이

my @AA = map { unpack('C', $_) } split //, substr($message, 3); 
을위한 거라고 생각 :

나는 다음과 같은 시도

에 최적화 할 수 있습니다.

my @AA = map ord, split //, substr($message, 3); 

하지만 unpack을 사용합니다. 트릭은 번호를 사용하여 유형을 따르거나 추출 할 숫자를 나타내는 *을 사용할 수 있다는 것입니다. 가능한 선택 그가 여러 솔루션을 제공하고 설명하기위한

my @AA = unpack('C*', substr($message, 3)); 

my @AA = unpack('x3 C*', $message); 

my ($header, @AA) = unpack('a3 C*', $message); 

my ($header, $body) = unpack('a3 a*', $message); 
my @AA = unpack('C*', $body); 
+0

감사합니다 다시 –

+1

문자의 숫자가 문자의 접두어 인 경우 'n/C'도 있습니다. – ikegami