我想把一個 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 鏈接的代碼):
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。我不知道是什么問題。
任何見解將不勝感激。
uj5u.com熱心網友回復:
如果要讀取 213 位元組,可以分配一個 213 位元組的 uint8_t 緩沖區。
uint8_t buffer[213] = {0};
recv(new_server_socket,buffer,sizeof(buffer),0);
如果套接字中可用,這將讀取 213 個位元組到緩沖區中。
如果您嘗試從服務器讀取緩沖區大小,然后分配該大小的緩沖區,我相信這就是您在 MATLAB 中所做的,請在 size 欄位上呼叫 ??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的回傳值。
上面也提到了位元組排序,如果是這種情況,您可以在閱讀 field_len 后使用 ntohs 將網路位元組排序轉換為主機位元組排序
field_len = ntohs(field_len);
然后繼續為緩沖區分配記憶體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/434832.html
上一篇:分配給堆分配的記憶體
