我正在通过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/

10-10 11:28