Здесь есть как минимум две отдельные проблемы.Один из них заключается в том, как структурировать код Matlab, который говорит на таком протоколе.Другой способ его представления, возможно, сложных данных в этом проводном протоколе, который у вас есть.
Что касается организации кода Matlab, вы можете использовать класс для организации сообщения более структурированным образом и использовать typecast
преобразовать числа в байты.Может быть как то такЭто предполагает, что ваш клиент и сервер имеют одно и то же собственное представление примитивных типов, и игнорирует сетевое упорядочение байтов (htonl / ntohl).
classdef learnvst_message
%//LEARNVST_MESSAGE Message for learnvst's example problem
%
% Examples:
% msg = learnvst_message;
% msg.payload = { 'Hello world', 1:100 }
% msg.payloadType = uint8([ 5 12 0 0 ]); % guessing on this
properties
magicNumber = uint32(445566);
payloadType = zeros(4, 1, 'uint8'); %// header B
payload = {};
end
methods
function out = convertPayload(obj)
%//CONVERTPAYLOAD Converts payload to a single array of bytes
byteChunks = cellfun(@convertPayloadElement, obj.payload, 'UniformOutput',false);
out = cat(2, byteChunks{:});
end
function out = marshall(obj)
payloadBytes = convertPayload(obj);
messageSize = uint32(4 + numel(payloadBytes)); %// ex first 8 bytes
out.headerBytes = [
typecast(obj.magicNumber, 'uint8') ...
obj.payloadType ...
typecast(messageSize, 'uint8')];
out.payloadBytes = payloadBytes;
end
function sendTo(obj, host, port)
m = marshall(obj);
mySocket = Socket(host, port);
d_output = mySocket.getOutputStream();
d_output.write(m.headerBytes, 0, numel(m.headerBytes));
d_output.write(m.messageBytes, 0, numel(m.messageBytes));
mySocket.close();
end
end
end
function out = convertPayloadElement(x)
if isnumeric(x)
out = typecast(x, 'uint8');
elseif ischar(x)
% Assumes receiver likes 16-bit Unicode chars
out = typecast(uint16(x), 'uint8');
else
% ... fill in other types here ...
% or define a payload_element class that marshalls itself and call
% it polymorphically
error('Unsupported payload element type: %s', class(x));
end
end
Я думаю, более читабельно и немного меньше запаха кодаКак вызывающая сторона вы можете работать с данными в более структурированной форме, и она инкапсулирует преобразование в байты проводного протокола внутри метода сортировки класса.Именно «convertPayload» - это то, что «объединяет общий блок памяти, состоящий из множества различных типов данных».В Matlab массив uint8
- это способ добавлять представления разных типов данных вместе в непрерывный блок памяти.По сути, это обертка вокруг unsigned char []
с автоматическим перераспределением.И typecast(...,'uint8')
является своего рода эквивалентом повторного толкования в char *
в C / C ++.См. Справку для них обоих.
Но это вызывает больше вопросов.Как сервер знает, как долго каждый из компонентов полезной нагрузки, какова их форма, если он многомерен, и каковы их соответствующие типы?Или что, если они являются сложными типами данных - могут ли они быть вложенными?Вам может понадобиться встроить маленькие заголовки в каждый из элементов полезной нагрузки.В приведенном выше коде предполагается, что 4-байтовый заголовок типа полезной нагрузки полностью описывает содержимое полезной нагрузки.
Звучит так, как будто вы ищете, может быть своего рода форматом самоописания для данных на основе гетерогенного массива.Для этого существуют форматы, в том числе NetCDF, HDF5 и собственные MAT-файлы Matlab.Matlab имеет встроенную поддержку для них, или вы можете использовать сторонние библиотеки Java для них.
Что касается скорости - вам придется платить каждый раз, когда вы передаете данные через Matlab /Java граница.Большие примитивные массивы относительно дешевы для преобразования, поэтому вы, вероятно, захотите упаковать большую часть сообщения в байтовый массив в Matlab перед передачей его в Java, вместо того чтобы выполнять множество отдельных вызовов write ().На практике это будет зависеть от того, насколько большими и сложными будут ваши данные.См. Медленно ли работает MATLAB OOP или я что-то не так делаю? , чтобы получить приблизительное представление о стоимости некоторых операций Matlab, включая вызовы Java.(Полное раскрытие: это саморазъем.)