如何实现unsigned short与unsigned char/字符串互转并获取预期输出?
解决unsigned short与字符串的互转问题
嘿,我来帮你搞定这个转换问题!首先得理清你现有代码的问题,再一步步实现你想要的效果。
现有代码的问题分析
你当前的代码是把unsigned short的每个字节单独提取出来转成十进制字符串拼接,但这和你预期的直接保留原始数值的字符串完全不是一回事。举个例子:
a=1234的低字节是1234 & 0xFF = 210,高字节是1234 >> 8 = 4,所以你的代码会生成"2104"而不是预期的"1234"- 同理
b=5678会被拆成5678 & 0xFF = 230和5678 >>8 =22,拼接后是"23022",最终整个字符串会变成"210423022",完全不符合你的预期。
正确的unsigned short转字符串方法
要得到预期的"12345678",直接把整个unsigned short值转成字符串再拼接就可以了:
#include <iostream> #include <string> int main() { unsigned short a = 1234; unsigned short b = 5678; std::string str = ""; // 直接将整个unsigned short转成字符串拼接 str += std::to_string(a); str += std::to_string(b); std::cout << "String Value: " << str << std::endl; // 输出就是预期的 "String Value: 12345678" return 0; }
如果你的转换逻辑围绕结构体展开,也可以封装成结构体转字符串的函数,方便批量处理:
struct MyStruct { unsigned short val1; unsigned short val2; // 更多成员... }; // 结构体转字符串 std::string structToString(const MyStruct& s) { std::string res; res += std::to_string(s.val1); res += std::to_string(s.val2); // 其他成员同理追加 return res; }
从字符串还原unsigned short值
现在要把拼接后的字符串转回原始的unsigned short,关键是要明确每个数值在字符串中的边界,这里提供两种实用方案:
方案1:固定长度存储(补前导零)
因为unsigned short的最大值是65535(5位数字),可以约定每个数值转字符串时固定占5位,不足补前导零,这样还原时直接按固定长度拆分即可:
// 转字符串时补前导零,保证固定5位长度 std::string toFixedLengthStr(unsigned short num) { char buf[6]; // 5位数字+字符串结束符 snprintf(buf, sizeof(buf), "%05hu", num); return std::string(buf); } // 从固定长度字符串还原结构体 void stringToStruct(const std::string& str, MyStruct& s) { // 第一个unsigned short:取前5个字符 s.val1 = static_cast<unsigned short>(std::stoul(str.substr(0, 5))); // 第二个unsigned short:取接下来的5个字符 s.val2 = static_cast<unsigned short>(std::stoul(str.substr(5, 5))); // 其他成员依次按5位长度拆分 }
方案2:用分隔符标记边界
如果不想补前导零,可以用分隔符(比如逗号)把每个数值的字符串分开,还原时通过分隔符定位拆分:
// 带分隔符的结构体转字符串 std::string structToStringWithSep(const MyStruct& s) { std::string res; res += std::to_string(s.val1) + ","; res += std::to_string(s.val2); return res; } // 从带分隔符的字符串还原结构体 void stringToStructWithSep(const std::string& str, MyStruct& s) { size_t sepPos = str.find(','); s.val1 = static_cast<unsigned short>(std::stoul(str.substr(0, sepPos))); s.val2 = static_cast<unsigned short>(std::stoul(str.substr(sepPos + 1))); }
内容的提问来源于stack exchange,提问作者Blessy
相关产品推荐
相关产品推荐

