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);
然后继续为缓冲区分配内存。
我想把一段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);
然后继续为缓冲区分配内存。