2010-12-04 2 views
2

지원 "% 02X"와 같은 형식으로 c 코드를 사용하여 인쇄 된 일부 16 진수 원시 데이터가 있습니다. 내가 좋아하는 몇 가지 형식으로 다음을 디코딩 할perl : 16 진수 데이터를 정수, 문자열로 디코딩하는 방법?

\x00\x20\x00\x10\xfd\x02\x10\x00\x00\x00\x00\x20\xff\x02\x10\x00\x00\x00\x00\x00 \x05\x00\x011\x00\x01\x00\n\x00\x0240

:
는 그래서 그들은 같이
처음 두 바이트 진수 "\ x00부터 \ X20"는 USHORT 디코딩해야합니다 다음
두 개의 B 16 진수 "\ x00 \ x10"을 ushort로 디코딩해야합니다.
다음 8B 16 진수 "\ xfd \ x02 \ x10 \ x00 \ x00 \ x00 \ x00 \ x20"은 64 비트로 코딩해야합니다.
다음 8B 16 진수 "\ xff \ x02 \ x10 \ x00 \ x00 \ x00 \ x00"\ x00 "은 64 비트로 코딩해야합니다.
다음 3 바이트 16 진수는 3 문자로 디코딩되어야합니다.
....

가 어떻게 펄
의 디코딩을 구현합니까 (16 진수를 출력 할 방법을 각 진수 사이의 백 슬래시가 왜 BTW 내가 이해하지, 그것은이다)?

답변

1

s{\\x(..)}{chr hex $1}eg; (단일 바이트) 또는 unpack("v", "\x00\x20"); (자세한 내용은 언팩 기능 참조).

+0

#!/usr/bin/perl -w $ _ = "\ x61 \ x62"; {\\ x (..)} {chr hex $ 1} 예; 인쇄 "approach1 : $ _ \ n"; $ str2 = unpack ("v", "\ x61 \ x62"); 인쇄 "approach2 : $ str2 \ n"; – user389955

+0

대답은 다음과 같습니다. bash-3.00 # ./hex2str.pl 접근 1 : ab 접근 2 : 25185 – user389955

+0

실제로. 그리고 그것은 전적으로 당신이 사용하는 접근법을 원하는 것에 달려 있습니다. 언젠가 ushort ("shorts"가없는 Perl의 부족 - "\ x61 \ x62"는 문자열이고 "ab"는 다른 문자열이며 25185는 보통 int의 용량 임)이므로 접근법 2를 사용하십시오 ; 다른 쪽은 "hex2str"이라고 말하고, 따라서 appoach 1을 사용하십시오. – user502515

0
  1. 데이터를 디코딩 :
    • s/\\x(..)/chr hex $1/eg/;
    • 더 나은 여전히, 당신은 입력을 생성하는 C 코드를 제어 할 수 있습니다 가정, 처음에 출력 바이너리 데이터에 그것을 얻을 전적으로이 단계를 피할 수 있습니다.
  2. 구성 요소를 디코딩하는 데 unpack을 사용하십시오.
관련 문제