2016-03-28 34 views
0

Oyuncularımın sağlığını okumaya çalışıyorum. Rol yaptım ama bir sorunla karşılaştım. Hangi tür bilgilerin belirli bir adreste olduğunu okuyabiliyorum, ancak gerçek değerin ne olduğunu okuyamıyorum, örneğin aldığım yanıt budur. Ben hangi bilgilerin arıyorumPython ktiplerle okuma belleğini okuma

<ctypes.c_char_Array_64 object at 0x0000000002EBF9C8> 

c_char_Array_64 nesne düzenlenen ama bu konuda giderdim nasıl hiçbir fikrim yok edilir. docs itibaren

print(ar2.value) 

: Bu değeri almak gerekir

class User: 
    ctypes.wintypes.DWORD = "Entity" 
    ctypes.wintypes.c_int = "Team" 
    ctypes.wintypes.c_int = "Health" 
    ctypes.wintypes.c_int = "Player" 

    def getSelfInfo(self): 
     adr1 = clientdll + dw_LocalPlayer 
     adr2 = ctypes.create_string_buffer(64) 
     bytes_read = ctypes.c_size_t() 

     (rPM(PROCESS.handle, adr1, adr2, sys.getsizeof(ctypes.wintypes.DWORD), ctypes.byref(bytes_read))) 
     print adr2 
t = User() 
t.getSelfInfo() 
+0

Yandan notu: 'sys.getsizeof (ctypes.wintypes. DWORD) size yararlı bir değer getirmiyor; Python yorumcusunun Python seviye sınıfını saklamak için size söylendiğini söylüyor. C 'DWORD' boyutunu istiyorsanız, 'ctypes.sizeof (ctypes.wintypes.DWORD) '. Ayrıca, "ctypes.wintypes.DWORD =" Varlık "ve benzerlerini yapamazsınız, bu bir değişken bildirme şekliniz değil (aslında DWORD türünün üzerine yazıyorsunuz). Hedefinizi bir 'ctypes' yapısını yapmayı düşünüyorum; [bunu nasıl yapacağınız için dokümanlar] 'a bakın. (https://docs.python.org/3/library/ctypes.html#structures-and-unions) – ShadowRanger

cevap

1

: Burada

benim kodudur

Eğer değişken hafıza blokları gerekiyorsa, ctypes (a create_string_buffer vardır) bunları çeşitli şekillerde yaratan işlev. Geçerli bellek bloğu içeriklerine ham mülküyle erişilebilir (veya değiştirilir); Eğer NUL dize sonlandırıldı olarak erişmek istiyorsanız, değeri özelliğini kullanın:

>>> from ctypes import * 
>>> p = create_string_buffer(3)  # create a 3 byte buffer, initialized to NUL bytes 
>>> print sizeof(p), repr(p.raw) 
3 '\x00\x00\x00' 
>>> p = create_string_buffer("Hello")  # create a buffer containing a NUL terminated string 
>>> print sizeof(p), repr(p.raw) 
6 'Hello\x00' 
>>> print repr(p.value) 
'Hello' 
>>> p = create_string_buffer("Hello", 10) # create a 10 byte buffer 
>>> print sizeof(p), repr(p.raw) 
10 'Hello\x00\x00\x00\x00\x00' 
>>> p.value = "Hi" 
>>> print sizeof(p), repr(p.raw) 
10 'Hi\x00lo\x00\x00\x00\x00\x00' 
>>> 
0

en ctypes dizi tiplerinin boş dilim Python eşdeğer türü dönecektir. Yani bir str için 64 bayt tampon dönüştürmek için (PY3 bytes cinsinden), yapabileceğiniz: Tam ham 64 bayt okuyacaktır

print ar2[:] 

sakıncası. Eğer bir C tarzı dizesi olarak okumak istiyorsanız (yani ilk NUL bayt Python eşdeğer str sonlandırır) kullanarak, .value kullanmak:

print ar2.value 
+0

Sadece herhangi bir değer basamaz. boş satır – Scheming

+0

@Scheming: Ar2' her ikisi de 'print' hiçbir şey yazamaz boş dizeyse,' NUL 'baytını yazdırmak çoğu terminal kurulumlarında hiçbir şey göstermez. Biraz daha açık olmalıydım. Bir dosyaya yazıyorsanız veya Python'daki verileri işliyorsanız, fark anlamlıdır, ancak terminalde mutlaka yazdırılmamalıdır. Eğer 'a [12] = b'a' 'a atarsanız, o zaman “a” ndan önce “a” ile basılmış olsa bile, muhtemelen bir ofsetle yazdırılır. – ShadowRanger

+0

Hala belirsiz, bunun benim oyuncunun sağlığını nasıl sağlayacağını anlamadım – Scheming