gpt4 book ai didi

swift - 如何以 littleEndian 方式在 Swift 中对 NSData 输出进行字节反转?

转载 作者:搜寻专家 更新时间:2023-10-30 22:06:02 25 4
gpt4 key购买 nike

我从 NSData 得到这个输出:<00000100 84000c00 071490fe 4dfbd7e9>

那么我怎样才能在 Swift 中对它进行字节反转并得到这个输出:<00000001 0084000c 1407fe90 fb4de9d7>?

最佳答案

这应该可以交换数据中的每对相邻字节。这个想法是将字节解释为 UInt16 的数组。整数并使用内置的 byteSwapped属性(property)。

func swapUInt16Data(data : NSData) -> NSData {

// Copy data into UInt16 array:
let count = data.length / sizeof(UInt16)
var array = [UInt16](count: count, repeatedValue: 0)
data.getBytes(&array, length: count * sizeof(UInt16))

// Swap each integer:
for i in 0 ..< count {
array[i] = array[i].byteSwapped // *** (see below)
}

// Create NSData from array:
return NSData(bytes: &array, length: count * sizeof(UInt16))
}

如果您的实际意图是从(外部)转换数据主机( native )字节顺序的大端表示(在所有当前的 iOS 和 OS X 设备上恰好是小端)那么你应该替换 ***通过

array[i] = UInt16(bigEndian: array[i])

例子:

var bytes : [UInt8] = [1, 2, 3, 4, 5, 6, 7, 8]
let data = NSData(bytes: &bytes, length: bytes.count)
print(data)
// <01020304 05060708>
print(swapUInt16Data(data))
// <02010403 06050807>

Swift 3 更新:通用 withUnsafeMutableBytes()方法允许获得 UnsafeMutablePointer<UInt16>到字节并直接修改它们:

func swapUInt16Data(data : Data) -> Data {
var mdata = data // make a mutable copy
let count = data.count / MemoryLayout<UInt16>.size
mdata.withUnsafeMutableBytes { (i16ptr: UnsafeMutablePointer<UInt16>) in
for i in 0..<count {
i16ptr[i] = i16ptr[i].byteSwapped
}
}
return mdata
}

例子:

let data = Data(bytes: [1, 2, 3, 4, 5, 6, 7, 8])
print(data as NSData) // <01020304 05060708>

let swapped = swapUInt16Data(data: data)
print(swapped as NSData) // <02010403 06050807>

关于swift - 如何以 littleEndian 方式在 Swift 中对 NSData 输出进行字节反转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30195267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com