2012-08-23 3 views
0

파이썬하는 ctypes를 얻을 캐스팅이 정상입니다, b_v.value 공통 문자 인 경우파이썬하는 ctypes가 널 (null) 문자열을

b 주소

이다 널 (null) 문자열을 얻을 캐스팅. 그러나 b의 내용은 진수는 16 진수 "00" 결과가 아마 1122 001314

는 이제 모든 컨텐츠 "1122001314"을 얻을 원하는 잃을 수 있어야입니다 들어 있습니다 긴으로 "1122001314"와 같은 경우. 방법 감사드립니다.

코드는 다음과 같습니다

b_v=ctypes.cast(b,ctypes.POINTER(ctypes.c_char_p)) 

print binascii.b2a_hex(b_v.value) 

예 :

import ctypes 
import binascii 

va=binascii.a2b_hex('1212273031003535') 
tt=ctypes.create_string_buffer(va) 
b=ctypes.addressof(tt) 
b_v=ctypes.cast(b,ctypes.c_char_p) 
print binascii.b2a_hex(b_v.value) 

지금 결과는 다음과 같습니다 "1212273031"

난 결과는 당신이 tt=ctypes.create_string_buffer(va) 라인에서 "1212273031003535"

+1

에 Weclome. 귀하의 질문에 대한 표현을 향상 시키거나 원하는 것을 나타내는 구체적인 코드 예제를 제공하십시오 (입력 및 예상 출력). 귀하의 질문을 이해하는 것은 매우 어렵습니다. –

+0

예제 코드가 보완됩니다 – w32c

답변

2

이다 싶어 hexa에서 string_buffer 만들기 데이터 (이진 데이터)의 10 진수 표현 및 C 문자열이 첫 번째 0 값 문자로 끝나기 때문에 잘못된 것입니다. 따라서 데이터가 손상됩니다. 다행스럽게도 ctypes는 문자열 값 외에도 원시 데이터를 제공하므로 tt.raw을 사용하면 원래 데이터에 액세스 할 수 있으며 binascii.b2a_hex(tt.raw)을 사용할 수 있지만 잘 모르겠다.

당신이 b=ctypes.addressof(tt)을 실행하고 다른 곳으로 주소를 통과 한 후 b_v=ctypes.cast(b,ctypes.c_char_p)에 의해 주소에서 데이터를 검색 할 경우에, 나는 '그것은 이진 데이터를 그리고 당신이 할 수있는, 데이터가 텍스트하지 않기 때문에 그것은 string_buffer 종류와 수는 없습니다 말을해야 string_buffer에 저장 한 다음 It의 주소로 액세스하십시오.

당신은 당신이 너무 데이터의 길이를 알고있는 경우 나 아는하여 데이터를 검색 할 수 있습니다,이 시도 : 유래에

b, l = ctypes.addressof(tt), len(tt) - 1 # l - 1, because there is one extra byte for terminator NULL 

#Somewhere else: 
b_v=ctypes.cast(b, ctypes.POINTER(ctypes.c_char * l)) 
print binascii.b2a_hex(b_v.contents) 
+0

binascii.b2a_hex (tt.raw)는 유용하지만 b를 통해서만 내용을 가져옵니다 – w32c

+0

b_v = ctypes.cast (b, ctypes.c_char_p)이 줄을 변경할 수 있습니다 – w32c

+0

b , 경우에만 데이터의 길이를 알고, 내 대답에 예제를 추가했다 – MostafaR