我正在通过TCP将一个灰度帧(160x120)从LabVIEW发送到这个C程序。我设法把字节转换成uint32像素值。这里的目标是,我将每19203字节定义一个图像数组,其中第一个字节是定义数组ID的头,第二个和第三个字节定义分辨率(120和160),最后19200字节是从LabVIEW程序接收的字节。其目的是第一个数组的第一个字节将得到值“1”,第二个数组的第一个字节将得到值“2”,依此类推。
这种情况下的问题发生在我检查19203字节时。我可以清楚地看到,在值4801之前,每个uint32值似乎都是正确的。从这个值到19203年,我得到了一个恒定的奇怪值:“3435973836”,这与灰度像素无关,因为它只能在0到300之间。错误发生在哪里?.
#define DEFAULT_BUFLEN 19203
int main(int argc , char *argv[])
{
WSADATA wsa;
SOCKET s , new_socket;
struct sockaddr_in server , client;
int c;
int iResult;
int receivedCount = 0;
char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN;
typedef unsigned int uint8_t;
unsigned long totalReceived = 0, totalExpected=160*120;
unsigned int i;
uint32_t image[DEFAULT_BUFLEN];
size_t len;
uint8_t* p;
uint8_t value;
int x=0;
int z=0;
p = (uint8_t*)recvbuf;
do
{
iResult = recv( new_socket, recvbuf, recvbuflen, 0);
for(z=1; z<11; z++)
{
image[0] = z;
for(i=0, x=1; i<19202,x<19203; i++, x++)
{
image [x] = p[i];
printf("%lu\n",image[x]);
}
}
}
while(iResult > 0 );
closesocket(new_socket);
WSACleanup();
return 0;
}
最佳答案
recv()
可能不一定读取您请求它读取的所有字节——它返回的字节可能比您请求的少。您需要始终检查recv()
的返回值,并且只处理这么多字节。通过忽略返回值,您正在读取未初始化的内存。
3435973836这个数字在十六进制中更容易解释——它是0xcccccccc。Visual Studio运行时使用此magic number来初始化调试生成中的堆栈内存,因此当您看到该值时,就知道您正在读取未初始化的堆栈内存。
关于c - 装入大型一维阵列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21055766/