Я генерирую протокол для сокета tcpip между python и matlab.При попытке настроить какой-то протокол я столкнулся с проблемой.Это связано с этим набором кода ниже
FPath = Path('c:/test/dogg.jpg')
HASH = Commons.get_file_md5_hash((FPath))
msg = ('IDINFO'+FPath.name+'HASH'+ HASH+'\n')
генерирует сообщение
IDINFOdogg.jpgHASH7ad1a930dab3c099939b66267b5c57f8
Я имею в сообщении: IDINFO
, который сообщит серверу имя файлаи HASH
, который сообщит подробности файла.
После этого я открываю файл, используя
f = open(FPath,"rb")
chunk = f.read(1020)
и собираю пакет с тегом DATA
впереди
msg = b`DATA` + chunk + b'\n'
Проблема в том, что b'\n'
не такой, как в первом сообщении.поскольку Matlab не может прочитать разделитель и не будет продолжать захват фрагментов данных.
Код Matlab для ссылки ниже.Это не весь объект, а та часть, которая потенциально может вызвать проблемы.Для настройки обратного вызова.
set(gh.tcpipServer, 'BytesAvailableFcnMode','Terminator');
set(gh.tcpipServer, 'BytesAvailableFcn', @(h,e)gh.Serverpull(h,e));
Функция для просмотра байтов
function Serverpull(gh,h,e)
gh.msg = fread(gh.tcpipServer,gh.tcpipServer.BytesAvailable);
gh.msgdecode = char(transpose(gh.msg));
if strfind(gh.msgdecode,'IDINFO')
Hst = strfind(gh.msgdecode,'HASH');
gh.Fname = gh.msgdecode(7:Hst-1);
gh.HASH = gh.msgdecode(Hst+4:end);
fwrite(gh.tcpipServer,'GoodToGo');
gh.PrepareforDataAq()
elseif strfind(gh.msgdecode,'DATA')
fwrite(gh.fileID,gh.msg(5:end),'double');
elseif strfind(gh.msgdecode,'EOF')
fclose(gh.fileID);
display('File Transfer Complete')
end
end
function PrepareforDataAq(gh)
path = fullfile('c:\temp\',gh.Fname);
gh.fileID = fopen(path,'w');
end
Для TLDR,
Как сделать строку '\n'
одинаковойкак b \n
при построении tcp-сообщения из двоичного файла вместо строк перед кодированием?