Jest to następujące pytanie do Moje pytanie pozostawiono bez odpowiedzi
Edytuj i zorganizowany

z mojego modułu:

class t_data_block(Structure):
_fields_ = [("current_readings",c_ulong * PORTS_NUM),
            ("power_reading",c_ulong)]

class t_sys_flags(Structure):
"System flags"
_fields_ = [("Alarm1",c_ulong,1),
            ("Alarm2",c_ulong,1),
            ("reserved",c_ulong,30)]

class t_input_buff(Structure):
"Input buffer from the board"
    _fields_ = [("header",c_ulong),
                ("sys_flags", t_sys_flags),# t_sys_flags is another structure
                ("data_block", t_data_block * CHIP_NUM)] # t_data_block is another structure

Muszę przejść przez każdy bajt w w bufcie i próbowałem:

from pc_memory import* 
def calc_formula(buff,len):
    sum = 0
    for curChar in buff:
        numericByteValue = ord(curChar)
        sum += numericByteValue
    return sum

def main:
    input_buff = t_input_buff()

    calc_formula(input_buff,len)

I otrzymuję "Błąd: TypeError:" T_Input_buff "nie jest iterable" Po wykonaniu polecenia dla

Próbowałem też użyć str(buff) bez szczęścia
Jakieś sugestie?

0
Gil.I 4 grudzień 2011, 12:10

3 odpowiedzi

Najlepsza odpowiedź

Znalazłem rozwiązanie: (skróciłem oryginalne struktury ułatwiające zrozumienie)

from ctypes import*  

class t_mem_fields(Structure):
    _fields_ = [("header",c_ulong),
                ("log", c_byte *  10)]             

class t_mem(Union):
    _fields_ = [("st_field",t_mem_fields),
                ("byte_index",c_byte * 14)]  

def calc(buff,len):
    sum = 0
    print(type(buff))
    for cur_byte in buff.byte_index:
         print "cur_byte = %x" %cur_byte
         sum += cur_byte
    print "sum = %x" %sum
    return sum     

def main():
    mem1 = t_mem()
    mem1.st_field.header = 0x12345678
    mem1.byte_index[4] = 1
    mem1.byte_index[5] = 2
    mem1.byte_index[6] = 3
    mem1.byte_index[7] = 4

   calc(mem1,14)

main()
0
Gil.I 5 grudzień 2011, 08:09

Sprawdź Bufor:

from binascii import hexlify
x = t_input_buff()

x.header = 1
x.sys_flags.Alarm1 = 1
x.sys_flags.Alarm2 = 0
x.sys_flags.reserved = 0x15555555
x.data_block[0].current_readings[0] = 2
x.data_block[0].current_readings[1] = 3
x.data_block[0].power_reading = 4
x.data_block[1].current_readings[0] = 5
x.data_block[1].current_readings[1] = 6
x.data_block[1].power_reading = 7

b = buffer(x)
print hexlify(b[:])

Wynik:

0100000055555555020000000300000004000000050000000600000007000000

Możesz także użyć CDYPES Casting:

p=cast(byref(x),POINTER(c_byte*sizeof(x)))
print p.contents[:]

Wynik:

[1, 0, 0, 0, 85, 85, 85, 85, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0]

Uwaga: w Pythonie 3, {X0}} nie istnieje już. bytes i list(bytes(...)) Daj równowartość buffer i przykładu odlewania CTTYPES.

4
Mark Tolonen 4 październik 2018, 01:21

Nie wiem, jaki jest rzeczywisty typ zmiennej "Buff", ale możesz spróbować wyraźnie przekonwertować go na ciąg w głowie pętli

for curChar in str(buff):

0
Sergey Karpukhin 4 grudzień 2011, 08:28