Arrays 如何在Swift中将连续的浮点数组转换为字节数组?

Arrays 如何在Swift中将连续的浮点数组转换为字节数组?,arrays,swift,serialization,binaryfiles,Arrays,Swift,Serialization,Binaryfiles,我试图用Swift将一个连续的浮点数组转换成一个字节数组,但是如果不使用for循环,就找不到一个聪明的方法。我一直在关注以前的文章,例如,但是如果不逐一迭代获取每个元素,我无法检索数组的内容 有没有一种优雅的方法可以将连续数组的字节直接复制到字节数组 PS:我已经成功地实现了将结构转换为字节数组,但无法对数组执行同样的操作 您可以使用该方法获取指向阵列连续存储的底层字节的缓冲区指针,并直接从该缓冲区指针初始化[UInt8]阵列。例如: let floatArray: [Float] = [1.0

我试图用Swift将一个连续的浮点数组转换成一个字节数组,但是如果不使用for循环,就找不到一个聪明的方法。我一直在关注以前的文章,例如,但是如果不逐一迭代获取每个元素,我无法检索数组的内容

有没有一种优雅的方法可以将连续数组的字节直接复制到字节数组

PS:我已经成功地实现了将结构转换为字节数组,但无法对数组执行同样的操作

您可以使用该方法获取指向阵列连续存储的底层字节的缓冲区指针,并直接从该缓冲区指针初始化[UInt8]阵列。例如:

let floatArray: [Float] = [1.0, 2.0]
// Works also with a ContiguousArray:
// let floatArray: ContiguousArray<Float> = [1.0, 2.0]

let byteArray = floatArray.withUnsafeBytes { Array($0) }
print(byteArray) // [0, 0, 128, 63, 0, 0, 0, 64]
字节数组包含以主机字节顺序表示的浮点数的二进制表示,在所有当前的Apple平台上都是小端。可以转换为big-endian,但不能没有整数数组的中间副本:

let floatArray: ContiguousArray<Float> = [1.0, 2.0]
let intArray = floatArray.map { $0.bitPattern.bigEndian }
let byteArray = intArray.withUnsafeBytes(Array.init)
print(byteArray) // 63, 128, 0, 0, 64, 0, 0, 0]
但是,这要求字节数组的元素存储正确对齐浮点数。如果不能保证,那么你可以这样做

var floatArray2 = [Float](repeating: 0.0, count: byteArray.count / MemoryLayout<Float>.stride)
_ = floatArray2.withUnsafeMutableBytes { byteArray.copyBytes(to: $0) }
print(floatArray2) // [1.0, 2.0]
您可以使用该方法获取指向阵列连续存储的底层字节的缓冲区指针,并直接从该缓冲区指针初始化[UInt8]阵列。例如:

let floatArray: [Float] = [1.0, 2.0]
// Works also with a ContiguousArray:
// let floatArray: ContiguousArray<Float> = [1.0, 2.0]

let byteArray = floatArray.withUnsafeBytes { Array($0) }
print(byteArray) // [0, 0, 128, 63, 0, 0, 0, 64]
字节数组包含以主机字节顺序表示的浮点数的二进制表示,在所有当前的Apple平台上都是小端。可以转换为big-endian,但不能没有整数数组的中间副本:

let floatArray: ContiguousArray<Float> = [1.0, 2.0]
let intArray = floatArray.map { $0.bitPattern.bigEndian }
let byteArray = intArray.withUnsafeBytes(Array.init)
print(byteArray) // 63, 128, 0, 0, 64, 0, 0, 0]
但是,这要求字节数组的元素存储正确对齐浮点数。如果不能保证,那么你可以这样做

var floatArray2 = [Float](repeating: 0.0, count: byteArray.count / MemoryLayout<Float>.stride)
_ = floatArray2.withUnsafeMutableBytes { byteArray.copyBytes(to: $0) }
print(floatArray2) // [1.0, 2.0]

请编辑您的帖子并显示所需的输入和输出。请编辑您的帖子并显示所需的输入和输出,但不包含非安全字节[UInt8]。init@LeoDabus:好建议!即使使用UnsafebytesArray.init,它也可以自动进行类型推断。相反的方向是什么?非常感谢!数组$0或Array.init成功了。谢谢你们,马丁@LeoDabus@jiko或者使用非安全字节[UInt8]。init@LeoDabus:好建议!即使使用UnsafebytesArray.init,它也可以自动进行类型推断。相反的方向是什么?非常感谢!数组$0或Array.init成功了。谢谢你们,马丁@LeoDabus@jiko