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

我试图在Swift中使用htonl()设置整数字节顺序,但是编译器没有findhtonl()方法。

我一直在使用这个作为我的参考: 追加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) 

我刚刚在一个操场上运行。 错误是:

 Use of unresolved identifier 'htonl' 

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

你应该使用CFSwapInt32HostToBig() CoreFoundation方法,因为htonl很可能是作为一个Cmacros而不能在swift中工作的。

但是,这看起来目前在Swift游乐场中并不适用。 我得到的错误Playground execution failed: error: error: Couldn't lookup symbols: __OSSwapInt32尽pipeCoreFoundation文档现在包括Swift中的方法签名其字节交换方法。

有趣的是,至less有一部分的<arpa/inet.h>已经被移植到swift中,因为像inet_ntoa()inet_ntoa()这样的方法可以被Swift使用,但是htonl不是。

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

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

Swift 3的更新:

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

或者,使用新的Data值types:

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

而不是使用CFSwapInt32HostToBig()作为亚历克斯Pretzlavbuild议你应该使用

 CFSwapInt32() 

代替

 ntonl() and ntohl() 

 CFSwapInt16() 

代替

 ntons() and ntohs() 

你的代码应该看起来像

 import Foundation import CFNetwork import CoreFoundation var data = NSMutableData() var number : UInt32 = 12 var convertedNumber : UInt32 = CFSwapInt32(number) data.appendBytes(&convertedNumber, length: 4) 

也有

 CFSwapInt64() 

用于8位整数交换。

编辑1

当然,你应该只使用这些函数只处理器little end整数因为我提供的function无论如何执行字节交换。