我正在尝试使用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)
更新: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家庭是没有的.
| 归档时间: |
|
| 查看次数: |
8493 次 |
| 最近记录: |