Ios 将Swift小端十六进制值转换为十进制
我在实现将十六进制值(小端)转换为十进制值的函数时遇到困难 所以我在写函数:Ios 将Swift小端十六进制值转换为十进制,ios,swift,endianness,Ios,Swift,Endianness,我在实现将十六进制值(小端)转换为十进制值的函数时遇到困难 所以我在写函数: func convertHexLittleEndianToDeciaml(input:String) -> (int) 并且输入总是4个字节(所以输入字符串中有8个字符) convertexhlittleendiantodeciaml(“606d0000”)的值应返回28000您可以这样写: (见更新) 更新 很抱歉,上面的代码有一些溢出问题,例如“FF010000”: 更新2 因此,我发现在错误情况下返回
func convertHexLittleEndianToDeciaml(input:String) -> (int)
并且输入总是4个字节(所以输入字符串中有8个字符)
convertexhlittleendiantodeciaml(“606d0000”)的值应返回28000
您可以这样写:
(见更新)
更新
很抱歉,上面的代码有一些溢出问题,例如“FF010000”:
更新2
因此,我发现在错误情况下返回一个有效的Int32
,可能会导致一个不容易发现的bug。我建议您将返回类型更改为可选,并在出现错误时返回nil
func convertHexLittleEndianToDeciaml(input:String) -> Int32? {
guard let beValue = UInt32(input, radix: 16) where input.characters.count == 8 else {
return nil
}
return Int32(bitPattern: beValue.byteSwapped)
}
if let value = convertHexLittleEndianToDeciaml("606d0000") {
print(value) //->28000
} else {
print("Hex format invalid")
}
下面是一个解决方案,它适用于我写的更长的数字:
func convert(number: String) -> Int {
var formatted = number
if number.count <= 16 {
let difference = 16 - number.count
for _ in 0..<difference {
formatted.append("0")
}
} else {
return 0
}
let value = UInt64(formatted, radix: 16) ?? 0
let z = value.byteSwapped
let final = UInt64(bitPattern: Int64(z))
return Int(final)
}
func转换(数字:字符串)->Int{
var格式=数字
如果number.count 6d60的十进制数是28000,而不是280。那么它返回的是什么?向我们展示您的代码并告诉我们失败的地方:)为什么您的输入是字符串而不是Int?输入字符串可以有多短/多大?为什么在您的示例中它的字符数是奇数?抱歉,伙计们,我刚刚更新了问题。@WMios@Martin$这是答案非常感谢!!@androisojavaswift,我在第一个答案中解决了一些问题。请使用后一个代码。另外值得注意的是,字符串和基数为16的整数初始化(init(:radix:))必须以大端表示字符串。这解释了为什么使用byteswaped作为提问者需要一点端的解释。
func convertHexLittleEndianToDeciaml(input:String) -> Int32? {
guard let beValue = UInt32(input, radix: 16) where input.characters.count == 8 else {
return nil
}
return Int32(bitPattern: beValue.byteSwapped)
}
if let value = convertHexLittleEndianToDeciaml("606d0000") {
print(value) //->28000
} else {
print("Hex format invalid")
}
func convert(number: String) -> Int {
var formatted = number
if number.count <= 16 {
let difference = 16 - number.count
for _ in 0..<difference {
formatted.append("0")
}
} else {
return 0
}
let value = UInt64(formatted, radix: 16) ?? 0
let z = value.byteSwapped
let final = UInt64(bitPattern: Int64(z))
return Int(final)
}