Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

1. 关键词

关键字:

C++ 数据格式化 字符串处理 std::string int hex 跨平台

应用场景:

  • int 型的数据打印成十六进制字符串
  • 二进制的data打印成十六进制字符串。

2. strfmt.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#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. 测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#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. 运行结果

1
2
3
4
5
6
---------------------------------------------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。

推荐阅读
C++数据格式化6 - uint转换成二六进制字符串 C++数据格式化6 - uint转换成二六进制字符串 C++系统相关操作7 - 判断系统大小端&大小端的数据转换 C++系统相关操作7 - 判断系统大小端&大小端的数据转换 C++ 字符串处理1-将字符串转成大写或小写 C++ 字符串处理1-将字符串转成大写或小写

评论