2014-09-18 5 views
0

У меня есть приложение в (windows), которое отправляет журналы в двоичном формате. C# код для преобразования, что струны:python parse двоичные данные

public static CounterSampleCollection Deserialize(BinaryReader binaryReader) 
{ 
    string name = binaryReader.ReadString(); // counter name 
    short valueCount = binaryReader.ReadInt16(); // number of counter values 

    var sampleCollection = new CounterSampleCollection(name); 
    for (int i = 0; i < valueCount; i++) 
    { 
    // each counter value consists of a timestamp + the actual value 
    long binaryTimeStamp = binaryReader.ReadInt64(); 
    DateTime timeStamp = DateTime.FromBinary(binaryTimeStamp); 
    float value = binaryReader.ReadSingle(); 

    sampleCollection.Add(new CounterSample(timeStamp, value)); 
    } 
    return sampleCollection; 
} 

У меня есть питон UdP сокет, который слушает порт, но не знаю, как преобразовать двоичные данные я получаю в строки, так что я может проанализировать его дальше.

Может любой эксперт python, пожалуйста, помогите мне преобразовать эту функцию в функцию python, чтобы я мог преобразовать полученные данные в python.

Мой код до сих пор:

import socket 

UDP_IP = "0.0.0.0" 
UDP_PORT = 40001 

sock = socket.socket(socket.AF_INET, # Internet 
        socket.SOCK_DGRAM) # UDP 
sock.bind((UDP_IP, UDP_PORT)) 

while True: 
    data, addr = sock.recvfrom(8192) # buffer size is 8192 bytes 
    print "[+] : ", data 
    // this prints the binary 
    // convert the data to strings ?? 

ответ

0

Я использую-структуру для распаковки двоичных данных. https://docs.python.org/2/library/struct.html вот пример, который я использую для распаковки данных из статического файла.

import struct  
comp = open(traceFile, 'rb') 
aData = comp.read() 
s = struct.Struct('>' +' i i i f f f d i H H') 
sSize = s.size 
for n in range(0, len(aData), sSize): 
    print s.unpack(aData[n:n+sSize]) 
+0

S = struct.Struct ('>' + 'iiifffdi H H') sSize = с. размер в то время как True: данные, addr = sock.recvfrom (8192) # размер буфера 8192 байта #print "*** \ n", data print "*** \ n" для n в диапазоне (0 , len (data), sSize): print s.unpack (данные [n: n + sSize]) == Я получаю: struct.error: unpack требует строкового аргумента длиной 40 – admin0

0

Пример чтения из гнезд покрыта в следующем:

http://www.binarytides.com/receive-full-data-with-the-recv-socket-function-in-python/

Отрывок из этой ссылки дает вам некоторые инструменты для написания кода Python вы хотите. Фрагмент использует функцию try ... except и sleep() funciton. Ссылка содержит другие полезные советы. Но ключ к вашему вопросу состоит в том, что двоичные данные естественным образом преобразуются в строку python.

while 1: 
    #recv something 
    try: 
     data = the_socket.recv(8192) 
     if data: 
      total_data.append(data) 
      #change the beginning time for measurement 
      begin=time.time() 
     else: 
      #sleep for sometime to indicate a gap 
      time.sleep(0.1) 
    except: 
     pass 

#join all parts to make final string 
s = ''.join(total_data) # join accepts type str, so binary string is converted 

После того, как строка «S», необходимо разобрать на основе (1) Сепаратор для пары данных, которые вы имеете, (2) разделителя между датой и (3) формат даты поле. Я не знаю, что ваша двоичная строка выглядит, так что я просто эскиз некоторый код, который вы можете использовать:

results = [] 
from datetime import datetime 
pairs = s.split('\n') # assume that the pairs are linefeed-separated 
for pair in pairs: 
    sdate, scount = pair.split(',') # assume that a pair is separated by a comma 
    timestamp = datetime.strptime(sdate, "%Y-%m-%d %H:%M:%S.%f") # format must match sdate 
    count = int(scount) 
    results.append(timestamp, count) 
return results 
+0

http://pastebin.com/ 7fuq3NP5 - это то, что выглядит исходный вывод. Join не смог преобразовать его в строки. – admin0

+0

Я только что заметил в вашем коде C# ссылку на BinaryReader. Посмотрев на это и выполнив поиск на «python BinaryReader», я нашел хитон, http://code.activestate.com/recipes/577610-decoding-binary-files/, который создает класс BinaryReader, используя идею user3892766 «struct». Я думаю, что вам нужно иметь спецификацию UDP, чтобы конвертировать дату в год, месяц, день и т. Д. Сейчас я немного из глубины, сообщите нам, когда у вас есть решение. – xxyzzy

Смежные вопросы