作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有如下数据:
let data = Data(bytes: [206, 66, 49, 62])
然后我使用此扩展(来自 How to convert Data to hex string in swift )转换为十六进制字符串:
extension Data {
struct HexEncodingOptions: OptionSet {
let rawValue: Int
static let upperCase = HexEncodingOptions(rawValue: 1 << 0)
}
func hexEncodedString(options: HexEncodingOptions = []) -> String {
let hexDigits = Array((options.contains(.upperCase) ? "0123456789ABCDEF" : "0123456789abcdef").utf16)
var chars: [unichar] = []
chars.reserveCapacity(2 * count)
for byte in self {
chars.append(hexDigits[Int(byte / 16)])
chars.append(hexDigits[Int(byte % 16)])
}
return String(utf16CodeUnits: chars, count: chars.count)
}
}
然后它给出“ce42313e”作为十六进制字符串。现在我试图将其转换为有符号整数(32 位)二进制补码。我尝试了几种方法,但没有找到完美的东西。
当我在下面的链接中以十六进制十进制给出“ce42313e”时,该值为-834522818
http://www.binaryconvert.com/convert_signed_int.html
下面是我尝试将“ce42313e”转换为 int 的其中之一,它给了我 3460444478 ..而不是 -834522818 。
let str = value
let number = Int(str, radix: 16)
请帮助获取该值。
最佳答案
Int(str, radix: 16)
将字符串解释为十六进制无符号数字的表示。你可以将其转换为Int32
与
let data = Data(bytes: [206, 66, 49, 62])
let str = data.hexEncodedString()
print(str) // ce42313e
let number = Int32(truncatingBitPattern: Int(str, radix: 16)!)
print(number) // -834522818
但实际上您不需要为此目的使用十六进制表示。您的数据是有符号 32 位整数的大端表示,这是直接从数据中获取数字的方法:
let data = Data(bytes: [206, 66, 49, 62])
let number = Int32(bigEndian: data.withUnsafeBytes { $0.pointee })
print(number) // -834522818
关于swift - 如何将我的字节数据转换为十六进制字符串,然后转换为有符号整数(32 位)二进制补码..?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49541359/
我是一名优秀的程序员,十分优秀!