C++数据格式化5 - uint转换成十六进制字符串&二进制的data打印成十六进制字符串
1. 关键词
关键字:
C++ 数据格式化 字符串处理 std::string int hex 跨平台
应用场景:
- int 型的数据打印成十六进制字符串
- 二进制的data打印成十六进制字符串。
2. strfmt.h
#pragma once #include <string> #include <cstdint> #include <sstream> #include <iomanip> namespace cutl { /** * @brief Format data to a hex string. * * @param data the data to be formatted. * @param len the length of the data. * @param upper whether to use upper case or lower case for hex characters, default is upper case. * @param separator the separator between each pair of hex characters, default is space. * @return std::string the formatted string. */ std::string to_hex(const uint8_t *data, size_t len, bool upper = true, char separator = ' '); /** * @brief Format a uint8_t value to a hex string. * * @param value the value to be formatted. * @param upper whether to use upper case or lower case for hex characters, default is upper case. * @param prefix the prefix of the formatted string, default is empty. * @return std::string the formatted string. */ std::string to_hex(uint8_t value, bool upper = true, const std::string &prefix = ""); /** * @brief Format a uint16_t value to a hex string. * * @param value the value to be formatted. * @param upper whether to use upper case or lower case for hex characters, default is upper case. * @param prefix the prefix of the formatted string, default is empty. * @return std::string the formatted string. */ std::string to_hex(uint16_t value, bool upper = true, const std::string &prefix = ""); /** * @brief Format a uint32_t value to a hex string. * * @param value the value to be formatted. * @param upper whether to use upper case or lower case for hex characters, default is upper case. * @param prefix the prefix of the formatted string, default is empty. * @return std::string the formatted string. */ std::string to_hex(uint32_t value, bool upper = true, const std::string &prefix = ""); /** * @brief Format a uint64_t value to a hex string. * * @param value the value to be formatted. * @param upper whether to use upper case or lower case for hex characters, default is upper case. * @param prefix the prefix of the formatted string, default is empty. * @return std::string the formatted string. */ std::string to_hex(uint64_t value, bool upper = true, const std::string &prefix = ""); } // namespace cutl
3. strfmt.cpp
#include <sstream> #include <iomanip> #include <bitset> #include "strfmt.h" namespace cutl { static const char HEX_CHARS_UPPER[] = "0123456789ABCDEF"; static const char HEX_CHARS_LOWER[] = "0123456789abcdef"; std::string to_hex(const uint8_t *data, size_t len, bool upper, char separator) { const char *hex_chars = upper ? HEX_CHARS_UPPER : HEX_CHARS_LOWER; std::string output; output.reserve(3 * len); for (size_t i = 0; i < len; i++) { const char temp = data[i]; output.push_back(hex_chars[temp / 16]); output.push_back(hex_chars[temp % 16]); output.push_back(separator); } return output; } std::string to_hex(uint8_t value, bool upper, const std::string &prefix) { const char *hex_chars = upper ? HEX_CHARS_UPPER : HEX_CHARS_LOWER; std::string text = prefix; int c1 = value / 16; int c2 = value % 16; text.push_back(hex_chars[c1]); text.push_back(hex_chars[c2]); return text; } std::string to_hex(uint16_t value, bool upper, const std::string &prefix) { std::string text = prefix; text += to_hex((uint8_t)((value >> 8) & 0xFF), upper); text += to_hex((uint8_t)(value & 0xFF), upper); return text; } std::string to_hex(uint32_t value, bool upper, const std::string &prefix) { std::string text = prefix; text += to_hex((uint8_t)((value >> 24) & 0xFF), upper); text += to_hex((uint8_t)((value >> 16) & 0xFF), upper); text += to_hex((uint8_t)((value >> 8) & 0xFF), upper); text += to_hex((uint8_t)(value & 0xFF), upper); return text; } std::string to_hex(uint64_t value, bool upper, const std::string &prefix) { std::string text = prefix; text += to_hex((uint8_t)((value >> 56) & 0xFF), upper); text += to_hex((uint8_t)((value >> 48) & 0xFF), upper); text += to_hex((uint8_t)((value >> 40) & 0xFF), upper); text += to_hex((uint8_t)((value >> 32) & 0xFF), upper); text += to_hex((uint8_t)((value >> 24) & 0xFF), upper); text += to_hex((uint8_t)((value >> 16) & 0xFF), upper); text += to_hex((uint8_t)((value >> 8) & 0xFF), upper); text += to_hex((uint8_t)(value & 0xFF), upper); return text; } } // namespace cutl
4. 测试代码
#include "common.hpp" #include "strfmt.h" void TestToHex() { PrintSubTitle("TestToHex"); uint8_t a = 0x0f; std::cout << "uint8: " << cutl::to_hex(a) << std::endl; uint16_t b = 0xfc; std::cout << "uint16: " << cutl::to_hex(b) << std::endl; uint32_t c = 0x1b02aefc; std::cout << "uint32: " << cutl::to_hex(c) << std::endl; uint64_t d = 0xabcdef0123456789; std::cout << "uint64: " << cutl::to_hex(d) << std::endl; uint8_t bytes[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10}; std::cout << "bytes: " << cutl::to_hex(bytes, 16) << std::endl; }
5. 运行结果
---------------------------------------------TestToHex---------------------------------------------- uint8: 0F uint16: 00FC uint32: 1B02AEFC uint64: ABCDEF0123456789 bytes: 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10
6. 源码地址
更多详细代码,请查看本人写的C++ 通用工具库: common_util, 本项目已开源,代码简洁,且有详细的文档和Demo。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战