我正在通过 TCP 从 LabVIEW 向这个 C 程序发送一个灰度帧 (160x120)。我设法将字节转换为 uint32 像素值。这里的目标是我将每 19203 个字节定义为一个图像数组,其中第一个字节是定义数组 ID 的 header ,第二个和第三个字节定义分辨率(120 和 160),最后 19200 个字节是从 LabVIEW 程序接收字节。目的是第一个数组的第一个字节将获得值“1”,第二个数组的第一个字节将获得值“2”,依此类推。
当我检查 19203 字节时,就会出现这种情况的问题。我可以清楚地看到每个 uint32 值似乎都是正确的,直到值 4801。从该值到 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。这magic number Visual Studio 运行时使用它来初始化调试版本中的堆栈内存,因此当您看到该值时,您就知道您正在读取未初始化的堆栈内存。
关于c - 框成一个大的一维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21055766/