如何在Swift中使用htonl设置整数字节序?

Mic*_*ael 18 ios swift

我正在尝试使用htonl()Swift 设置整数字节序,但编译器没有找到该htonl()方法.

我一直在使用它作为我的参考:将NSInteger附加到NSMutableData

这是我的代码:

import Foundation
import CFNetwork
import CoreFoundation

var data = NSMutableData()
var number : UInt32 = 12
var convertedNumber : UInt32 = htonl(number)
data.appendBytes(&convertedNumber, length: 4)
Run Code Online (Sandbox Code Playgroud)

我刚刚在操场上跑步.错误是:

Use of unresolved identifier 'htonl'
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 31

从Xcode 6,Beta 3开始,所有整数类型都有一个bigEndian方法,它返回整数的大端表示,并在必要时更改字节顺序.例:

var data = NSMutableData()
var number : UInt32 = 0x12345678
var convertedNumber = number.bigEndian
data.appendBytes(&convertedNumber, length: 4)
print(data)
// Output: <12345678>
Run Code Online (Sandbox Code Playgroud)

Swift 3更新:

let data = NSMutableData()
let number: UInt32 = 0x12345678
var convertedNumber = number.bigEndian
data.append(&convertedNumber, length: 4)
Run Code Online (Sandbox Code Playgroud)

或者,使用新Data值类型:

var data = Data()
let number: UInt32 = 0x12345678
var convertedNumber = number.bigEndian
withUnsafePointer(to: &convertedNumber) {
    data.append(UnsafeRawPointer($0).assumingMemoryBound(to: UInt8.self), count: 4)
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你正在寻找相反的方向(网络到主机),你有`UInt32(bigEndian:number)`,以及其他整数类型的类似`inits`. (3认同)

Ale*_*lav 8

更新:Martin R的答案是当前Swift版本的正确答案:https://stackoverflow.com/a/24653879/195691

-

您应该使用CFSwapInt32HostToBig()CoreFoundation方法,因为htonl它可能实现为无法在swift中运行的C宏.

但是,看起来这似乎不适用于Swift游乐场.Playground execution failed: error: error: Couldn't lookup symbols: __OSSwapInt32尽管CoreFoundation文档现在包含Swift中用于字节交换方法的方法签名,但我收到了错误.

有趣的是,它看起来像的至少一部分<arpa/inet.h>已经被移植到迅速,像方法inet_ntoa()和inet_addr()可用来斯威夫特,但htonl家庭是没有的.