当前位置: 首页 > 面试题库 >

在Swift中将bytes / UInt8数组转换为Int

宗政博文
2023-03-14
问题内容

如何将一个4字节的数组转换为相应的Int?

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

例:

输入:

\0\0\0\x0e

输出:

14

我在互联网上发现的某些代码不起作用:

let data = NSData(bytes: array, length: 4)
data.getBytes(&size, length: 4)
// the output to size is 184549376

问题答案:

有两个问题:

  • Int 在64位平台上是64位整数,您的输入数据只有32位。
  • Int 在所有当前的Swift平台上使用小尾数表示法,您输入的是大尾数。

话虽如此,以下方法会起作用:

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

Data在Swift 3中使用:

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

使用一些缓冲区指针魔术,您可以避免中间复制到NSData对象(Swift 2):

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

print(value) // 14

有关此方法的Swift 3版本,请参见环境光的答案。



 类似资料:
  • 问题内容: 使用Swift,我想将字节从uint8_t数组转换为整数。 “ C”示例: 快速尝试: 从Swift中的UInt8数组创建UInt16值的正确语法或代码是什么? 我对NSData版本感兴趣,并且正在寻找不使用临时数组的解决方案。 问题答案: 如果您想通过,它将像这样工作: 或者: 两种变体都假定字节按主机字节顺序排列。 Swift 3(Xcode 8)更新:

  • 问题内容: 我在将Byte数组快速转换为字符串时遇到问题。我搜索并找到一个简单的解决方案 但是显示错误没有成员。谁能建议我解决方案? 这是我要获取的代码,并将其转换为字节数组,然后我必须将该字节数组转换为字符串。 问题答案: Swift 3 / Xcode 8 更新 : 来自的字符串: 来自的字符串: Swift 2 / Xcode 7 更新 : 来自的字符串: 来自的字符串: 先前的答案: 没有

  • 问题内容: 我正在尝试将int []转换为bytes。它也被转换。 我的转换代码是这样的。 假设我输入一个int [] = {10,11,15,41,12,8,4,23,5,17,23,36,6}现在我希望字节数组像这样{10,0 ,0,0,11,0,0,0,15,0,0,0,41,0,0,0,12,0,0,0,8,0,0,0,4,0,0 ,0,23,0,0,0,5,0,0,0,17,0,0,0,

  • 问题内容: 我有以下代码: 如何转换回相同的字节数组? 我问的原因是因为我想通过加密的十六进制字符串与服务器通信,所以我需要将其转换回字节数组以将字符串解码为其原始格式。 问题答案: 您可以将六进制字符串转换回UInt8数组,该数组每两个六个字符重复一次,并使用UInt8基数16初始化程序从中初始化UInt8: 编辑/更新: Xcode 14•Swift 5.1 操场:

  • 问题内容: 所以,我需要你的帮助。我找不到关于那个话题的任何东西。Golang是一种新鲜出炉的语言,因此对于像我这样的新手来说很难快速找到答案。 问题答案: 预先定义的Go 类型大小是特定于实现的,是32位还是64位(数字类型)。 这是将big-endian s 转换为s(s)的示例。 输出: 要么

  • 问题内容: 这不再适用于Xcode 8 beta 6: 要么 错误是:上下文类型’CFArray’不能与数组文字一起使用 从数组转换为CFArray的最新方法是什么? 问题答案: 如果添加演员表,它将起作用: 或者您可以在通话中添加演员表: 在Swift 3(Xcode 8 beta 6)中,已删除对桥接类型的隐式转换。 在某些情况下,例如这种情况,您将需要添加显式强制转换以使其起作用。