Форум сайта python.su
0
Здравствуйте все. Уже второй день никак не могу решить одну задачу, понимаю, что всё просто и понимаю, что код мой корявый, но из открытых пары десятков вкладок решения так и не нашел, поэтому прошу помощи… Суть в том, что мне нужно принимать энное количество байт от сервера и записывать в файл определенного формата.
Я создаю соккет, подключаюсь к серверу, принимаю данные в список, потом конвертирую список в строку. Далее формирую строку хедера для файла, после чего приклеиваю строку хедера к строке данных и записываю всё это в файл и наблюдаю такую картину: хедер находится в начале файла, но не в виде байтов, а как текст… То есть хедер выглядит так: 0xbad4feed0x125e773c1120x7d170x400 и он просто текстом написан в начале бинарника…
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import socket import time sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('192.168.1.58', 32023)) y = 0 buffr = 0 data = [] while y < 65536: buffr = sock.recv(1024) x = sys.getsizeof(buffr) y = x + y data.append(buffr) current_milli_time = lambda: int(round(time.time() * 1000)) pre_head = ''.join(hex(0xBAD4FEED) + hex(current_milli_time()) + hex(32023) + hex(1024)) pre_data = ''.join(data) head = pre_head.replace('L','') head = head.encode("utf-8") flush = head + pre_data my_file = open("tcp.slf", 'ab') my_file.write(flush) my_file.close() sock.close()
Отредактировано darwol (Окт. 6, 2016 11:46:39)
Офлайн
35
Здесь много зависит еще от версии Python'a, так, например, начиная с Python3.2 у int-типа есть метод to_bytes, который упрощает жизнь.
Будем, однако, считать, что у нас, что-то вродe Py2.7+
Сначала создадим вспомогательную функцию, которая будет конвертировать наши целые (int) в шестнадцатиричное представление с четной длиной:
def convert(int_value): encoded = format(int_value, 'x') length = len(encoded) encoded = encoded.zfill(length+length%2) return encoded
header = 'bad4beef' + convert(current_milli_time()) + convert(32023) + convert(1024)
head = pre_head.replace('L','')Этого я не понял.
tosave = bytearray.fromhex(header) + ''.join(data)
with open('myfile.dat', 'ab') as f: f.write(tosave)
Отредактировано scidam (Окт. 7, 2016 03:22:52)
Офлайн
253
scidamмне так не кажется
Здесь много зависит еще от версии Python'a,
import struct data = b"abcd" head = struct.pack("4I",0xBAD4FEED,33,32023,1024) with open("x.dat","wb") as f: f.write(head) f.write(data)
Офлайн
35
Пожалуй, это не существенно, но все-таки struct.pack не сможет упаковать большие числа. А convert, определенный выше, на это способен.
Офлайн