【问题标题】:Little-endian byte order小端字节序
【发布时间】:2014-01-08 21:01:45
【问题描述】:

我通过 TCP/IP 连接不断地将像素值数组从 LabVIEW 发送到 C 程序。 C 程序接收字节流,因此我使用以下代码将字节转换为 uint32 以打印数组中的所有像素值。有谁知道在这种情况下如何将字节顺序切换为 little-endian?:

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* endp;
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;
}

【问题讨论】:

标签: c sockets tcp endianness


【解决方案1】:

发送前使用htonl()将32位整数从主机字节序转换为网络字节序,接收后使用ntohl()将32位整数从网络字节序转换为主机字节序。还有 htons()ntohs() 用于 16 位整数。让函数决定如何为您转换值。在小端系统上,实现这些功能以执行实际转换。在大端系统上,这些功能被实现为无操作。

【讨论】:

  • 我从 LabVIEW 以小端序发送字节流。所以我也必须在这段代码中切换到litte-endian,对吧?
  • 网络字节顺序是大端。如果 LabVIEW 以 little endian 格式发送数据,而您的应用程序在 little endian 系统上运行,则无需执行任何特殊操作,数据已经采用正确的 endian 格式。但是,如果 LabVIEW 以小端序发送并且您的应用程序在大端序系统上运行,那么您需要转换这些值。您的代码以 CPU 原生使用的任何字节序运行,因此每当您的应用数据与外部系统交互时,您必须注意字节序问题。
【解决方案2】:

使用宏/函数系列http://linux.die.net/man/3/ntohs 通过网络发送数据。那么你根本不会有任何问题。

【讨论】:

  • 对不起,我错误地编辑了您的答案。刚刚修好,抱歉!
猜你喜欢
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
相关资源
最近更新 更多