将C字节序和指针黑魔法移植到Swift

Per*_*val 2 c pointers endianness swift

我正在尝试翻译此代码段:

ntohs(*(UInt16*)VALUE) / 4.0
Run Code Online (Sandbox Code Playgroud)

和其他一些看起来相似的,从C到斯威夫特.问题是,我对Swift知之甚少,我无法理解这个片段的作用......以下是我所知道的全部内容:

  • ntohs 交换字节序以主持字节序
  • VALUE 是一个 char[32]
  • 我刚刚发现Swift:(UInt(data.0) << 6) + (UInt(data.1) >> 2)做同样的事情.可以解释一下吗?
  • 我愿意回来一个Swift Uint(UInt64)

谢谢 !

Sul*_*han 7

  1. VALUE是一个指向32个字节(char[32])的指针.
  2. 指针被强制转换为UInt16指针.这意味着前两个字节VALUE被解释为UInt16(2个字节).
  3. *将取消引用指针.我们得到两个字节VALUE作为16位数.但是它有net endianness(净字节顺序),所以我们不能对它进行整数运算.
  4. 我们现在将endianness交换为host,我们得到一个正常的整数.
  5. 我们将整数除以4.0.

要在Swift中执行相同的操作,我们只需将字节值组合为整数即可.

let host = (UInt(data.0) << 8) | UInt(data.1)
Run Code Online (Sandbox Code Playgroud)

请注意,要除以,4.0必须将整数转换为Float.

  • 如果`data.0`包含MSB和`data.1`是16位整数的LSB,则`(UInt(data.0)<< 8)| UInt(data.1)`已经是正确的数字,必须*不是*按字节顺序转换. (2认同)