[英]How do I set integer endianness using htonl in Swift?
我正在尝试在Swift中使用htonl()
设置整数字节htonl()
,但是编译器没有找到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)
我刚刚在操场上跑步。 错误是:
Use of unresolved identifier 'htonl'
从Xcode 6 Beta 3开始,所有整数类型都有bigEndian
方法,该方法返回整数的big-endian表示形式,并在必要时更改字节顺序。 例:
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
值类型:
var data = Data()
let number: UInt32 = 0x12345678
var convertedNumber = number.bigEndian
withUnsafePointer(to: &convertedNumber) {
data.append(UnsafeRawPointer($0).assumingMemoryBound(to: UInt8.self), count: 4)
}
更新 :马丁R的答案是当前版本的Swift的正确答案: https : //stackoverflow.com/a/24653879/195691
-
您应该使用CFSwapInt32HostToBig()
CoreFoundation方法,因为htonl
可能被实现为C宏,该宏无法快速运行。
但是,看起来这在Swift操场上目前无法使用。 我遇到了错误Playground execution failed: error: error: Couldn't lookup symbols: __OSSwapInt32
尽管事实上Playground execution failed: error: error: Couldn't lookup symbols: __OSSwapInt32
文档现在在Swift中为其字节交换方法包括了方法签名。
有趣的是,它看起来像的至少一部分<arpa/inet.h>
已经被移植到迅速,如类似方法inet_ntoa()
和inet_addr()
可用来夫特,但htonl
家庭并不。
不要像Alex Pretzlav建议的那样使用CFSwapInt32HostToBig()
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
当然,您应该仅在具有小尾数整数的处理器上使用这些函数,因为我提供的函数仍然会执行字节交换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.