Swift小端十六进制值转十进制
Swift Little endian hex value to decimal
我在实现将十六进制值(小端)转换为十进制值的函数时遇到困难。
所以我正在编写函数:
func convertHexLittleEndianToDeciaml(input:String) -> (int)
并且输入始终为 4 个字节(因此输入字符串中有 8 个字符)
convertHexLittleEndianToDeciaml("606d0000")
的值应该 return 28,000
你可以这样写:
(查看更新)
func convertHexLittleEndianToDeciaml(input:String) -> Int32 {
if let beValue = Int32(input, radix: 16) where input.characters.count == 8 {
return beValue.byteSwapped
} else {
//or `fatalError()` or `return 0` or ...
return Int32.min
}
}
print(convertHexLittleEndianToDeciaml("606d0000")) //->28000
更新
抱歉,上面的代码有一些溢出问题,比如 "FF010000":
func convertHexLittleEndianToDeciaml(input:String) -> Int32 {
if let beValue = UInt32(input, radix: 16) where input.characters.count == 8 {
return Int32(bitPattern: beValue.byteSwapped)
} else {
//or `fatalError()` or `return 0` or ...
return Int32.min
}
}
更新2
因此,我发现 return 在错误情况下输入有效的 Int32
可能会导致无法轻易找到的错误。我建议您在错误情况下将 return 类型更改为 Optional 和 return 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 convertHexLittleEndianToDeciaml(input:String) -> (int)
并且输入始终为 4 个字节(因此输入字符串中有 8 个字符)
convertHexLittleEndianToDeciaml("606d0000")
的值应该 return 28,000
你可以这样写: (查看更新)
func convertHexLittleEndianToDeciaml(input:String) -> Int32 {
if let beValue = Int32(input, radix: 16) where input.characters.count == 8 {
return beValue.byteSwapped
} else {
//or `fatalError()` or `return 0` or ...
return Int32.min
}
}
print(convertHexLittleEndianToDeciaml("606d0000")) //->28000
更新
抱歉,上面的代码有一些溢出问题,比如 "FF010000":
func convertHexLittleEndianToDeciaml(input:String) -> Int32 {
if let beValue = UInt32(input, radix: 16) where input.characters.count == 8 {
return Int32(bitPattern: beValue.byteSwapped)
} else {
//or `fatalError()` or `return 0` or ...
return Int32.min
}
}
更新2
因此,我发现 return 在错误情况下输入有效的 Int32
可能会导致无法轻易找到的错误。我建议您在错误情况下将 return 类型更改为 Optional 和 return 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)
}