我正在使用Swift,并尝试将Int(例如:-1133)转换为4个字节的字节数组。我能够将Int转换为8个字节的数组(-1333变为[255、255、255、255、255、255、250、203]),但我需要将其设为4个字节。我知道可以使用其他语言(例如Java)来做到这一点,但是Swift可以解决吗?这是我的代码:(我使用了THIS答案)
func createByteArray(originalValue: Int)->[UInt8]{
var result:[UInt8]=Array()
var _number:Int = originalValue
let mask_8Bit=0xFF
var c=0
var size: Int = MemoryLayout.size(ofValue: originalValue)
for i in (0..<size).reversed(){
//at: 0 -> insert at the beginning of the array
result.insert(UInt8( _number&mask_8Bit),at:0)
_number >>= 8 //shift 8 times from left to right
}
return result
}
答案 0 :(得分:1)
在Java中,整数始终为32位,但在Swift中,可以为32位或64位,具体取决于平台。您的代码在8位字节的64位平台上创建与Int
类型的字节数组大小相同的字节数组。
如果要将转换限制为32位整数,请使用Int32
而不是Int
,然后结果将是4个字节的数组,与平台无关。
另一种转换方法是
let value: Int32 = -1333
let array = withUnsafeBytes(of: value.bigEndian) { Array($0) }
print(array) // [255, 255, 250, 203]
或作为所有大小的整数类型的通用函数:
func byteArray<T>(from value: T) -> [UInt8] where T: FixedWidthInteger {
return withUnsafeBytes(of: value.bigEndian) { Array($0) }
}
示例:
print(byteArray(from: -1333)) // [255, 255, 255, 255, 255, 255, 250, 203]
print(byteArray(from: Int32(-1333))) // [255, 255, 250, 203]
print(byteArray(from: Int16(-1333))) // [250, 203]