【问题标题】:2 byte short into 2 byte string in C?2字节短成C中的2字节字符串?
【发布时间】:2012-10-16 19:05:08
【问题描述】:

在该short 上使用htons 后,任何将2 字节短(普通短)转换为2 字节字符串(char*)的方法。问题是 htons 方法返回一个 int(4 个字节),我如何将它放入一个 2 个字节的字符串???

注意:我需要能够对结果使用 ntohs 来获取原始值。

感谢您的建议:D

【问题讨论】:

  • 您要转换short 还是intint 现在大多是 4 个字节。
  • 我认为 htons 只是返回另一个短,所以真正的问题只是将短转换为 2 字节字符串

标签: c string byte short htonl


【解决方案1】:

啊,怎么说htons返回一个4字节的整数,在我的linux上,htons的原型是

uint16_t htons(uint16_t hostshort);

这样你就可以了

uint16_t value;
value = htons(hostshort);
char *bytes = &value;
// now the first 2 bytes pointed to by "bytes" are the value in network byte order

这意味着返回值只有 2 个字节。

然后我认为在 htons 之后,返回值的这种位表示是这样的,即值的第一个字节 (((unsigned char *)value)[0]) 是最重要的,而第二个是最不重要。

【讨论】:

  • 我不好,这对我来说也是一样的,但现在的问题是我如何将它变成一个只有 2 个字节的字符串。我尝试使用 sprintf 但想象一下 htons 返回 2000 例如如何将其存储到 2 个字节的字符串中? :(
【解决方案2】:
short i;
// ...
char s [3];
s [0] = (i >> 8) & 0xFF;
s [1] = i & 0xFF;
s [2] = '\0';

【讨论】:

  • 你能解释一下你在 s[0] 中放了什么,0xFF 是 NULL 对吗? :(
  • (i>>8) 将 i 的前 8 位移动 8 位,因此移至后 8 位,而 & 0xFF 将前 8 位屏蔽掉。 i & 0xFF 将 i 的低 8 位存储在 s[1] 中。然后 s[2] 为空
  • 我首先将i 转换为unsigned (short) 以避免>> 在负整数上的实现定义行为。
  • 是的,你可能是对的。然而,算术移位和二进制移位仅在“新插入”位方面有所不同,对于负数,算术右移为 1,二进制为 0。这不是标准化的吗?
  • 在这种情况下应该没关系;任何符号位都在 0xFF 掩码之外。
猜你喜欢
  • 2010-10-18
  • 2011-02-16
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多