2017-04-30 1 views
0

는 나는 내가 한 번에 두 개의 숫자를 받아어떻게 파이썬 원시 문자열을 16 진수로 변환합니까?

49 -> I 
54 -> T 
64 -> d 
00 -> \x00 
00 -> \x00 
처럼 아스키 테이블에서 적절한 값으로 변환한다고 가정 ASCII 표를 살펴보면

>>> word_str = "4954640000005200000005a7a90fb36ecd3fa2ca7ec48ca36004acef63f77157ab2f53e3f768ecd9e18547b8c22e21d01bfb6b3de325a27b8fb3acef63f77157ab2f53e3f768ecd9e185b7330fb7c95782fc3d67e7c3a66728dad8b59848c7670c94b29b54d2379e2e7a" 

>>> hex_str = word_str.decode('hex') 
>>> hex_str = "ITd\x00\x00\x00R\x00\x00\x00\x05\xa7\xa9\x0f\xb3n\xcd?\xa2\xca~\xc4\x8c\xa3`\x04\xac\xefc\xf7qW\xab/S\xe3\xf7h\xec\xd9\xe1\x85G\xb8\xc2.!\xd0\x1b\xfbk=\xe3%\xa2{\x8f\xb3\xac\xefc\xf7qW\xab/S\xe3\xf7h\xec\xd9\xe1\x85\xb73\x0f\xb7\xc9W\x82\xfc=g\xe7\xc3\xa6g(\xda\xd8\xb5\x98H\xc7g\x0c\x94\xb2\x9bT\xd27\x9e.z" 

16 진수로 변환하고있어 일부 원시 문자열이

그러나 어떤 점에서이 규칙은 다음

52 -> \x00R (00 and 52) 

를 나누기는 시간과

두 개의 번호를 가지고 진행 여기
00 -> \x00 
00 -> \x00 
00 -> \x00 
05 -> \x05 
a7 -> \xa7 
a9 -> \xa9 
0f -> \x0f 

그것은 상기는 (확장 ASCII 테이블에서) 적절한 값으로 여기

b36e -> \xb3n 

CD를 b3 변환하지 않고 하나의 동일한 시간에 2쌍 (b363)를 얻어

cd -> \xcd? 

내 목표는 C++에서 같은 (variable.decode ('헥스'))를 구현하는 것입니다 ... \xcd?하게,하지만 난 G의 이해 필요 여기서 어떤 알고리즘이 사용 되었습니까?

답변

0

사용자가 알아볼 수있는 형식으로 인쇄하기 위해 표현 인이 표시됩니다. 문자열 자체는 원래 16 진수 문자열의 각 바이트 값을 포함합니다 (각 바이트는 원래 두 자릿수에서 파생됩니다).

문자열의 일부 바이트는 인쇄 할 수 없거나 ASCII로 표시 할 수없는 문자입니다. 이 경우, 파이썬은 이스케이프 코드 인 \x과 그 뒤에 원래의 16 진수 두 자리를 사용합니다.

예 : b36e -> \xb3n에서 파이썬은 b3\xb3으로 변환합니다. 다음 바이트 인 6e은 소문자 n에 대한 ASCII이며 인쇄 가능하므로 축 어적으로 사용됩니다. 파이썬은 "한 번에 두 개씩 복용하지"않습니다. 각 바이트는 개별적으로 처리됩니다.

기본적으로 C++에서 "똑같은 작업"을 원할 경우 \x 이스케이프를 사용하여 32- 126 (축약 포함) 및 그 범위를 벗어나는 모든 문자를 추가하려고합니다.

C++에서 같은 것을 정말로하고 싶지는 않습니다. 아마도 으로 C++에서 파이썬 문자열 표현을 생성하고자하는 이유를 설명 할 수 있습니다.

+0

나는 (서버 장치와 통신하는 소켓 클라이언트) 코드를 가지고 있지만, 성능상의 이유로 인해 C++로 작성되어야한다. –

+0

문자 그대로 바이트 만 전송할 것입니다. 왜 서버로 보내기 위해 파이썬 스타일의 문자를 벗어날 수 있을지 상상할 수 없습니다. – kindall

+0

이 천재 대답에 대해 고마워하는 남자. Juts 지금 나는 wireshark로 그것을 검사했다. 그리고 그것은 정확하게 그것이다. –

관련 문제