Как запретить Matlab udp / fread конвертировать необработанные байтовые данные в двойные - PullRequest
0 голосов
/ 09 марта 2020

Я пытаюсь прочитать закодированные необработанные данные из UDP и передать их в мой пользовательский MEX-файл для декодирования. Теперь то, что я получаю, когда использую fread для чтения данных с моего UDP-порта, является двойным. Кроме того, документация для udp / fread говорит о том, что

По умолчанию числовые значения c возвращаются в массивах двойной точности

, однако, что он не говорит, так это как я могу предотвратить это преобразование и как получить необработанные байтовые значения. Я не использую плавающие значения, и мне пришлось бы конвертировать обратно в мой MEX-файл, что привело бы к ненужным накладным расходам.

РЕДАКТИРОВАТЬ: В соответствии с просьбой, вот небольшой пример.

u = udp();
u.LocalPort = 3333;
fopen( u );
data = fread( u, 10, 'uint8' );
fclose( u );

Предположим, что вы отправляете с помощью этого небольшого Python сценария:

import time
import socket

UDP_IP = "127.0.0.1"
UDP_PORT = 3333
MESSAGE = "Hello, World!"

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

while True:
    sock.sendto(bytes(MESSAGE, "utf-8"), (UDP_IP, UDP_PORT))
    time.sleep(.100)

Так же, как сказано в документации udp / fread, он обрабатывает ввод как uint8 и возвращает удвоенные значения. Однако, в отличие от документации fread для чтения из файлов , версия UDP, похоже, не понимает синтаксис * или => для указания типов вывода.

btw: I Я использую R2017b, может быть, это также имеет значение.

1 Ответ

1 голос
/ 09 марта 2020

Вы можете использовать вход 'precision' для fread ( документы ):

Form of the precision Input   Description

source                        Input values are of the class specified by source.
                              Output matrix A is class double.
                              Example: 'int16'

source=>output                Input values are of the class specified by source.
                              The class of the output matrix, A, is specified by output.
                              Example: 'int8=>char'

*source                       The input values and the output matrix, A, are of
                              the class specified by source. For bitn or ubitn precisions, 
                              the output has the smallest class that can contain the input.
                              Example: '*ubit18'
                              This is equivalent to 'ubit18=>uint32'

Так что вы должны иметь возможность использовать

A = fread( fid, 2, '*int16' ); % Use correct size instead of 2 depending on your type
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...