如何防止Matlab udp/fread将原始字节数据转换为双字节



我正在尝试从UDP读取编码的原始数据,并将其传递给我的自定义MEX文件进行解码。现在,当我使用fread从UDP端口读取数据时,我得到的是双倍的。此外,udp/fread的文档告诉

默认情况下,数值以双精度数组返回

然而,它并没有说明如何防止这种转换,以及如何获得原始字节值。我不使用浮动值,必须在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并返回double。然而,与用于从文件中读取的fread文档相比,UDP版本似乎不了解用于指定输出类型的*=>语法。

顺便说一句:我用的是R2017b,也许这也会有所不同。

您可以将'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

相关内容

  • 没有找到相关文章

最新更新