如何在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无论如何执行字节交换。