Convert bytes/UInt8 array to Int in Swift

前端 未结 7 578
野性不改
野性不改 2020-12-01 03:56

How to convert a 4-bytes array into the corresponding Int?

let array: [UInt8] ==> let value : Int

Example:

Input:

         


        
7条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-12-01 04:15

    There are two problems:

    • Int is a 64-bit integer on 64-bit platforms, your input data has only 32-bit.
    • Int uses a little-endian representation on all current Swift platforms, your input is big-endian.

    That being said the following would work:

    let array : [UInt8] = [0, 0, 0, 0x0E]
    var value : UInt32 = 0
    let data = NSData(bytes: array, length: 4)
    data.getBytes(&value, length: 4)
    value = UInt32(bigEndian: value)
    
    print(value) // 14
    

    Or using Data in Swift 3:

    let array : [UInt8] = [0, 0, 0, 0x0E]
    let data = Data(bytes: array)
    let value = UInt32(bigEndian: data.withUnsafeBytes { $0.pointee })
    

    With some buffer pointer magic you can avoid the intermediate copy to an NSData object (Swift 2):

    let array : [UInt8] = [0, 0, 0, 0x0E]
    var value = array.withUnsafeBufferPointer({ 
         UnsafePointer($0.baseAddress).memory
    })
    value = UInt32(bigEndian: value)
    
    print(value) // 14
    

    For a Swift 3 version of this approach, see ambientlight's answer.

提交回复
热议问题