Matlab 的“fread()”函数的 C 翻译是什么?

What is C translation for Matlab‘s `fread()` function?

我想把一段MATLAB代码翻译成C语言,但是MATLAB的fread()函数让我很困惑,不知道怎么翻译才好。我用recv()函数读取了数据,但是和我在MATLAB中得到的不一样

MATLAB 代码在这里:

field_len = fread(t, 1, 'uint16');        % t is a TCP object
code = fread(t,1);
bytes = fread(t, field_len-1, 'uint8');   % field_len > 1

我的C代码在这里(忽略建立TCP的代码link):

uint16_t field_len = 0;
uint8_t code = 0;
uint8_t bytes[field_len-1];

recv(new_server_socket, &field_len, sizeof(field_len), 0);  // new_server_socket is server socket to get data
recv(new_server_socket, &code, sizeof(code), 0);
recv(new_server_socket, bytes, sizeof(bytes), 0);

一个数字例子。在MATLAB中,field_len应该是213。但是在我的C代码中,是54528。我不知道是什么问题。

如有任何见解,我们将不胜感激。

如果你想读取 213 字节,你可以分配一个 213 字节的 uint8_t 缓冲区。

uint8_t buffer[213] = {0};
recv(new_server_socket,buffer,sizeof(buffer),0);

如果套接字中可用,这将读取 213 个字节到缓冲区。

如果您尝试从服务器读取缓冲区大小,然后分配该大小的缓冲区(我相信这是您在 MATLAB 中所做的),请在大小字段上调用 ​​recv,然后为动态缓冲并再次调用 recv。

uint16_t field_len = 0;
uint8_t* buffer = NULL;

recv(new_socket_server,&field_len,sizeof(field_len),0);

buffer = malloc(field_len);
memset(buffer,0,field_len);

recv(new_socket_server,buffer,field_len,0);

我没有做任何错误检查,但你应该经常检查 recv 的 return 值。

上面也提到了字节序,如果是这种情况你可以在阅读field_len

后使用ntohs将网络字节序转换为主机字节序
field_len = ntohs(field_len);

然后继续为缓冲区分配内存。