gpt4 book ai didi

c - C 中 uint32 的一维数组

转载 作者:行者123 更新时间:2023-11-30 17:41:42 26 4
gpt4 key购买 nike

我通过 TCP/IP 将像素值数组 (160x120) 作为字节流从 LabVIEW 持续发送到 C 程序。然后,我将字节转换为 uint32 值并在控制台应用程序中打印接收到的数据。这里的目标是,我想将接收到的数据划分为一维数组,因此每个一维数组将由 (160x120=19200) 整数值组成,因此它代表一个帧。换句话说,数组必须收集接收到的数据的每 19200 个整数,并将它们显示在控制台应用程序中。然后同一个数组必须收集接下来的 19200 个整数并将它们显示在控制台应用程序中,依此类推。如果有人展示如何做到这一点,我将不胜感激。

WSADATA wsa;
SOCKET s , new_socket;
struct sockaddr_in server , client;
int c;
int iResult;
char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN;
typedef unsigned int uint32_t;
unsigned int i;
size_t len;
uint32_t* p;
uint32_t value;

p = (uint32_t*)((void*)recvbuf);

do
{
iResult = recv(new_socket, recvbuf, recvbuflen, 0);
len = iResult/sizeof(uint32_t);

for(i=0; i < len; i++)
{
value = p[i];
}
printf("%d\n", value);

}
while ( iResult > 0 );

closesocket(new_socket);
WSACleanup();

return 0;

最佳答案

这段代码对事物的大小和对齐方式做出了很多假设。在 x86 系统上这可以正常工作,但要注意需要对齐的系统。它还假设两个系统具有相同的 endien-ness。

要接收分块为 160x120 uint32_t 字节 block 的数据(假设您的 DEFAULT_BUFLEN 正确):

int receivedCount = 0;
do
{
iResult = recv( new_socket,
&recvbuf[receivedCount],
DEFAULT_BUFLEN-receivedCount,
0 );
if ( iResult == 0 ) break; //0 == socket closed
receivedCount += iResult;
if ( receivedCount < DEFAULT_BUFLEN )
continue; //still receiving full frame
for(int i=0; i<160*120; i++)
printf("%d\n",(unsigned int)p[i]);
receivedCount = 0;
}
while( wantToContinueCapturingFrames );

这将持续等待数据,直到接收到完整的帧。一旦接收到完整的帧,它将打印出该帧的数据。如果远程系统关闭连接,这将退出而不打印任何部分帧。

这对于“真实”应用程序来说还不够,因为它在接收数据时阻塞。没有规定可以在远程系统不发送数据或关闭连接的情况下(优雅地)中止,但解决这个问题并不是您在这里真正要问的。

关于c - C 中 uint32 的一维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21025402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com