C-将UINT16_T转换为以通过套接字发送(UNIX)发送的char [2]



我知道那里有很多东西。但是我的大脑很受伤,我找不到任何可以做这项工作的东西...

我试图通过unix插座发送16位未签名的整数..为此,我需要将UINT16_T转换为两个字符,然后我需要在连接的另一端读取它们并将其转换回它进入未签名的int或uint16_t,那时它使用2个bytes或4个比(我正在运行64位,这就是为什么我不能使用unsigned int :)

我在C btw

中这样做

谢谢

为什么不将其分解为带有掩码的字节?

 uint16_t value = 12345;
 char lo = value & 0xFF;
 char hi = value >> 8;

(编辑)

在另一端,您以相反的方式组装:

 uint16_t value = lo | uint16_t(hi) << 8;

我的头顶不确定是否需要铸造。

char* pUint16 = (char*)&u16;

ie施放了uint16_t。

的地址
char c16[2];
uint16_t ui16 = 0xdead;
memcpy( c16, ui16, 2 );

C16现在包含U16的两个字节。在远端您可以简单地扭转过程。

char* pC16 = /*blah*/
uint16_t ui16;
memcpy( &ui16, pC16, 2 );

有趣的是,尽管几乎每个编译器都会呼叫memcpy,因为它的尺寸为固定尺寸。

正如史蒂文·萨德(Steven Sudt)指出的那样,您可能会遇到大端的问题。要解决这个问题,您可以使用HTON(主机到网络短)功能。

uint16_t ui16correct = htons( 0xdead );

在远端使用NTOHS(网络到主机短)

uint16_t ui16correct = ntohs( ui16 );

在一台小型机器上,这将把简短转换为大型末端,然后在远端转换为大型。在大型机器上,两个功能无能为力。

当然,如果您知道 网络上这两台机器的体系结构都使用相同的endian-ness,那么您可以避免此步骤。

查找NTOHL和HTONL处理32位整数。大多数平台还支持NTOHLL和HTONLL 64位。

听起来您需要使用位掩码和移动操作员。

将16位数字分成两个8位数字:

  • 您使用位和操作员(&amp; in c)掩盖了下部8位,以使上层8位全部变为0,然后将结果分配给一个char。
  • 您使用右移动操作员(>>在C中)向右移动8位,以便将下部8位全部从整数中推出,仅留下前8位,并将其分配给另一个char。

然后,当您在连接上发送这两个字符时,您会进行反面:您将过去是左侧的最佳8位移动8位,然后使用Bitwise或将其与其他8位相结合。

基本上您是在插座上发送2个字节,这是插座所需的所有内容,无论endianness,签名等等,都需要将UINT16分解为2个字节,然后发送它们在插座上。

char byte0 = u16 & 0xFF;
char byte1 = u16 >> 8;

在另一端以相反的方式进行转换

相关内容

  • 没有找到相关文章

最新更新