pickle.dump() массива numpy, а затем проблемы с кодированием и расшифровкой данных

#python #sockets #pickle

#питон #розетки #соленый огурец

Вопрос:

Длина рассола.отвал(рама) = 921 765

Продолжительность отправки и получения данных = 3 517 145

Я не понимаю, почему моя свалка маринованных огурцов и то, что я отправляю и получаю, имеют совершенно разные размеры. Я предполагаю, что это потому, что я превращаю дамп в строку с f"set frame {data}" помощью, а затем кодирую его в Protocol_Send.

ниже — вот где рассол.инициируется сброс.

 def Start_Camera(self):  self.start = True  camera =cv2.VideoCapture(0)  while self.start:  success, frame = camera.read()  if not success:  break  else:  data = pickle.dumps(frame) #LENGTH OF THIS IS 921,765  Protocol_Send(self.device.server, f"set frame {data}")  

Я отправляю свои данные со следующими Protocol_Send(self.device.server, f"set frame {data}") вот функция Protocol_Send

 def Protocol_Send(connection, message):  try:   if message == "":  return  if type(message) == str: #make sure our message is a string  message = message.encode() #Encode the string   length = str(len(message)).zfill(10) #Get the length of the string and make the number 4 digits regardless  connection.send(length.encode()) #Send the length of the next data block  connection.send(message) #Send the datablock  except Exception as e:  print(e)  

Когда данные получены сервером, который я использую Protocol_Receive , он переходит во вспомогательную функцию для анализа команд, а затем передается команде Set_Frame

 def Protocol_Receive(connection):   data = ""   length = int(connection.recv(10)) #Every message comes prefaced with a 10 bit size.  while length gt; 16384:  message = connection.recv(16384)  data  = message.decode()  length -= 16384  if length gt; 0:  message = connection.recv(length)  data  = message.decode()  length = 0  return data  

фрейм-это список данных, поэтому я просто присоединяюсь к нему. Данные собираются правильно, и в начале пропускается команда set frame. не оставляя ничего, кроме исходных данных дампа для рассола (очевидно, это не исходный дамп, хотя, потому что он в 3 раза больше, чем при отправке и получении).

 def Set_Frame(device, frame):  device = Device.devices[device]  frame = "".join(frame)  frame = frame.encode('utf8')   frame = pickle.loads(frame)  for module in device.modules:  if module.archetype == "camera":  module.Set_Camera_Frame(frame)  

Он ломается на рассоле.грузы(рама) с UnpicklingError('unpickling stack underflow')

Комментарии:

1. Я немного обеспокоен тем, что вы кодируете() все сообщение, но декодируете() его в 16 КБ байт. Возможно, вы разделяете двухбайтовую сущность. Лучше получить все сообщение целиком, а затем преобразовать его в данные. Хотя не знаю, в этом ли твоя проблема.