You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Objective-C如何将数值格式化为0x%04x十六进制格式并正确存储

问题根因

你最开始的printf("0x%04x", testValue);能输出0x0c45完全是巧合:%x格式符要求传入整数参数,你实际传入的是NSString对象的指针,打印出的是指针地址低16位的值,刚好和3141对应的十六进制结果重合,属于C语言的未定义行为,换运行环境就会得到错误结果,不能作为正确实现参考。
之前尝试的格式化代码输出0x0000,是因为传入的数值类型和格式符要求不匹配,取值出现了偏差。
十六进制本质是整数的文本表示形式,不存在“存储十六进制值”的特殊类型,根据你要存的是格式化字符串、还是整数值,分别用下面的实现即可。

实现方案

存储为带0x前缀的4位十六进制格式化字符串

和你验证通过的UInt16逻辑对齐,先把字符串转成16位无符号整数,再用格式符拼接即可:

NSString *testValue = @"3141";
UInt16 intValue = (UInt16)[testValue integerValue];
NSString *storedFormattedStr = [NSString stringWithFormat:@"0x%04x", intValue];

运行后storedFormattedStr的值就是0x0c45,如果需要大写的十六进制字符,把格式符里的%04x改成%04X即可得到0x0C45。

直接存储对应的整数值

如果你不需要字符串形式,要存0x0c45对应的数值本身,直接存转换后的16位无符号整数即可——整数在内存中以二进制存储,十进制3141和十六进制0x0c45是完全相等的同一个值:

NSString *testValue = @"3141";
UInt16 storedValue = (UInt16)[testValue integerValue];

后续不管是做数值计算、还是按十六进制格式打印,storedValue都能得到符合预期的结果。


内容的提问来源于stack exchange,提问作者Tooodi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 08:51:32