簡體   English   中英

如何在 Swift 中將 Int 轉換為 4 字節的字節數組?

[英]How to convert Int to byte array of 4 bytes in Swift?

我正在使用 Swift 並嘗試將 Int(例如:-1333)轉換為 4 字節的字節數組。 我能夠將 Int 轉換為 8 個字節的數組(-1333 變為 [255, 255, 255, 255, 255, 255, 250, 203]),但我需要它是 4 個字節。 我知道有其他語言可以做到這一點,比如 Java,但是 Swift 有辦法嗎? 這是我的代碼:(我使用了這個答案)

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
    }

在 Java 中,整數總是 32 位,但在 Swift 中,它可以是 32 位或 64 位,具體取決於平台。 您的代碼在 8 個字節的 64 位平台上創建一個與Int類型大小相同的字節數組。

如果要將轉換限制為 32 位整數,則使用Int32而不是Int ,結果將是 4 個字節的數組,與平台無關。

另一種轉換方法是

let value: Int32 = -1333
let array = withUnsafeBytes(of: value.bigEndian, Array.init)
print(array) // [255, 255, 250, 203]

或者作為所有大小的整數類型的通用函數:

func byteArray<T>(from value: T) -> [UInt8] where T: FixedWidthInteger {
    withUnsafeBytes(of: value.bigEndian, Array.init)
}

例子:

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]

但是,不像 Java 使用大端,iOS 平台使用“小端”代替。 所以如果是

let value: Int32 = -1333
let array2 = withUnsafeBytes(of: value.littleEndian, Array.init)// [203, 250, 255, 255]

您可以通過將值包裝到具有以下擴展名的數據中來驗證它並檢查字節

extension FixedWidthInteger {
    var data: Data {
        let data = withUnsafeBytes(of: self) { Data($0) }
        return data
    }
}
value.data

只是提醒那些正在研究 memory 布局的 iOS 開發人員。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM