Swift中如何将带前导零的十六进制字符串转为UInt16?
解决十六进制字符串转UInt16并保留格式的问题
完全可以直接将拆分后的十六进制字符串转为UInt16,关键是要指定十六进制基数来解析,同时如果需要输出0x0145这种带前导零的格式,要通过字符串格式化来实现。
核心问题分析
你之前用Int("0145")得到145,是因为默认以十进制解析字符串,把"0145"当成了十进制数。正确的做法是告诉编译器这是十六进制字符串。
具体实现代码(以Swift为例)
1. 解析十六进制字符串为UInt16
直接使用UInt16的初始化方法,指定radix: 16(表示十六进制):
// 解析"0145" if let firstValue = UInt16("0145", radix: 16) { print(firstValue) // 输出十进制数值:325(对应十六进制0x0145) } // 解析"9f7f" if let secondValue = UInt16("9f7f", radix: 16) { print(secondValue) // 输出十进制数值:40831(对应十六进制0x9F7F) }
这里得到的UInt16值本身就是你要的0x0145和0x9f7f对应的数值——数值本身不存在前导零的概念,0x0145和0x145在数值上是等价的,只是展示形式不同。
2. 输出带0x前缀和前导零的格式
如果需要把数值展示成0x0145或0x9f7f的形式,用String(format:)来格式化:
if let firstValue = UInt16("0145", radix: 16) { // 大写十六进制,保留4位前导零 print(String(format: "0x%04X", firstValue)) // 输出:0x0145 // 小写十六进制,保留4位前导零 print(String(format: "0x%04x", firstValue)) // 输出:0x0145 } if let secondValue = UInt16("9f7f", radix: 16) { print(String(format: "0x%04X", secondValue)) // 输出:0x9F7F print(String(format: "0x%04x", secondValue)) // 输出:0x9f7f }
为什么用UInt16?
4位十六进制数的范围是0x0000到0xFFFF,刚好对应UInt16的取值范围(0到65535),不会出现溢出问题,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者tp2376
相关产品推荐
相关产品推荐

