C++将字符串转换为十六进制,反之亦然
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3381614/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
C++ convert string to hexadecimal and vice versa
提问by Sebtm
What is the best way to convert a string to hex and vice versa in C++?
在 C++ 中将字符串转换为十六进制,反之亦然的最佳方法是什么?
Example:
例子:
- A string like
"Hello World"
to hex format:48656C6C6F20576F726C64
- And from hex
48656C6C6F20576F726C64
to string:"Hello World"
- 类似于
"Hello World"
十六进制格式的字符串:48656C6C6F20576F726C64
- 从十六进制
48656C6C6F20576F726C64
到字符串:"Hello World"
回答by fredoverflow
A string like "Hello World" to hex format: 48656C6C6F20576F726C64.
像“Hello World”这样的字符串到十六进制格式:48656C6C6F20576F726C64。
Ah, here you go:
啊,给你:
#include <string>
std::string string_to_hex(const std::string& input)
{
static const char hex_digits[] = "0123456789ABCDEF";
std::string output;
output.reserve(input.length() * 2);
for (unsigned char c : input)
{
output.push_back(hex_digits[c >> 4]);
output.push_back(hex_digits[c & 15]);
}
return output;
}
#include <stdexcept>
int hex_value(char hex_digit)
{
switch (hex_digit) {
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
return hex_digit - '0';
case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
return hex_digit - 'A' + 10;
case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
return hex_digit - 'a' + 10;
}
throw std::invalid_argument("invalid hex digit");
}
std::string hex_to_string(const std::string& input)
{
const auto len = input.length();
if (len & 1) throw std::invalid_argument("odd length");
std::string output;
output.reserve(len / 2);
for (auto it = input.begin(); it != input.end(); )
{
int hi = hex_value(*it++);
int lo = hex_value(*it++);
output.push_back(hi << 4 | lo);
}
return output;
}
(This assumes that a char has 8 bits, so it's not very portable, but you can take it from here.)
(这里假设一个字符有 8 位,所以它不是很便携,但你可以从这里获取它。)
回答by Krevan
string ToHex(const string& s, bool upper_case /* = true */)
{
ostringstream ret;
for (string::size_type i = 0; i < s.length(); ++i)
ret << std::hex << std::setfill('0') << std::setw(2) << (upper_case ? std::uppercase : std::nouppercase) << (int)s[i];
return ret.str();
}
int FromHex(const string &s) { return strtoul(s.c_str(), NULL, 16); }
回答by Mahmut EFE
You can try this. It's Working...
你可以试试这个。它正在工作...
#include <algorithm>
#include <sstream>
#include <iostream>
#include <iterator>
#include <iomanip>
namespace {
const std::string test="hello world";
}
int main() {
std::ostringstream result;
result << std::setw(2) << std::setfill('0') << std::hex << std::uppercase;
std::copy(test.begin(), test.end(), std::ostream_iterator<unsigned int>(result, " "));
std::cout << test << ":" << result.str() << std::endl;
}
回答by X-Istence
Using lookup tables and the like works, but is just overkill, here are some very simple ways of taking a string to hex and hex back to a string:
使用查找表等工作,但只是矫枉过正,这里有一些非常简单的方法将字符串转换为十六进制并将十六进制返回到字符串:
#include <stdexcept>
#include <sstream>
#include <iomanip>
#include <string>
#include <cstdint>
std::string string_to_hex(const std::string& in) {
std::stringstream ss;
ss << std::hex << std::setfill('0');
for (size_t i = 0; in.length() > i; ++i) {
ss << std::setw(2) << static_cast<unsigned int>(static_cast<unsigned char>(in[i]));
}
return ss.str();
}
std::string hex_to_string(const std::string& in) {
std::string output;
if ((in.length() % 2) != 0) {
throw std::runtime_error("String is not valid length ...");
}
size_t cnt = in.length() / 2;
for (size_t i = 0; cnt > i; ++i) {
uint32_t s = 0;
std::stringstream ss;
ss << std::hex << in.substr(i * 2, 2);
ss >> s;
output.push_back(static_cast<unsigned char>(s));
}
return output;
}
回答by X-Istence
Simplest example using the Standard Library.
使用标准库的最简单示例。
#include <iostream>
using namespace std;
int main()
{
char c = 'n';
cout << "HEX " << hex << (int)c << endl; // output in hexadecimal
cout << "ASC" << c << endl; // output in ascii
return 0;
}
To check the output, codepadreturns: 6e
要检查输出,键盘返回:6e
and an online ascii-to-hexadecimal conversion toolyields 6e as well. So it works.
并且在线ascii 到十六进制转换工具也可以生成 6e。所以它有效。
You can also do this:
你也可以这样做:
template<class T> std::string toHexString(const T& value, int width) {
std::ostringstream oss;
oss << hex;
if (width > 0) {
oss << setw(width) << setfill('0');
}
oss << value;
return oss.str();
}
回答by polfosol ?_?
I think there is a much simpler and more elegant solution. Some of the above-mentioned methods may even throw unhandled exceptions in some cases. Here is a fool-proof (as in never goes wrong) and very fast code. Just try it and compare the results in terms of speed and compactness:
我认为有一个更简单、更优雅的解决方案。在某些情况下,上述一些方法甚至可能抛出未处理的异常。这是一个万无一失(永远不会出错)和非常快速的代码。只需尝试一下并比较速度和紧凑性方面的结果:
#include <string>
// Convert string of chars to its representative string of hex numbers
void stream2hex(const std::string str, std::string& hexstr, bool capital = false)
{
hexstr.resize(str.size() * 2);
const size_t a = capital ? 'A' - 1 : 'a' - 1;
for (size_t i = 0, c = str[0] & 0xFF; i < hexstr.size(); c = str[i / 2] & 0xFF)
{
hexstr[i++] = c > 0x9F ? (c / 16 - 9) | a : c / 16 | '0';
hexstr[i++] = (c & 0xF) > 9 ? (c % 16 - 9) | a : c % 16 | '0';
}
}
// Convert string of hex numbers to its equivalent char-stream
void hex2stream(const std::string hexstr, std::string& str)
{
str.resize((hexstr.size() + 1) / 2);
for (size_t i = 0, j = 0; i < str.size(); i++, j++)
{
str[i] = (hexstr[j] & '@' ? hexstr[j] + 9 : hexstr[j]) << 4, j++;
str[i] |= (hexstr[j] & '@' ? hexstr[j] + 9 : hexstr[j]) & 0xF;
}
}
测试代码:
#include <iostream>
int main()
{
std::string s = "Hello World!";
std::cout << "original string: " << s << '\n';
stream2hex(s, s);
std::cout << "hex format: " << s << '\n';
hex2stream(s, s);
std::cout << "original one: " << s << '\n';
}
and the result is:
结果是:
original string: Hello World!
hex format: 48656C6C6F20576F726C6421
original one: Hello World!
回答by Nico
As of C++17 there's also std::from_chars. The following function takes a string of hex characters and returns a vector of T:
从 C++17 开始,还有std::from_chars。以下函数接受一串十六进制字符并返回 T 的向量:
#include <charconv>
template<typename T>
std::vector<T> hexstr_to_vec(const std::string& str, unsigned char chars_per_num = 2)
{
std::vector<T> out(str.size() / chars_per_num, 0);
T value;
for (int i = 0; i < str.size() / chars_per_num; i++) {
std::from_chars<T>(
str.data() + (i * chars_per_num),
str.data() + (i * chars_per_num) + chars_per_num,
value,
16
);
out[i] = value;
}
return out;
}
回答by Erik Hvatum
This is a bit faster:
这有点快:
static const char* s_hexTable[256] =
{
"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0a", "0b", "0c", "0d", "0e", "0f", "10", "11",
"12", "13", "14", "15", "16", "17", "18", "19", "1a", "1b", "1c", "1d", "1e", "1f", "20", "21", "22", "23",
"24", "25", "26", "27", "28", "29", "2a", "2b", "2c", "2d", "2e", "2f", "30", "31", "32", "33", "34", "35",
"36", "37", "38", "39", "3a", "3b", "3c", "3d", "3e", "3f", "40", "41", "42", "43", "44", "45", "46", "47",
"48", "49", "4a", "4b", "4c", "4d", "4e", "4f", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59",
"5a", "5b", "5c", "5d", "5e", "5f", "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6a", "6b",
"6c", "6d", "6e", "6f", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "7a", "7b", "7c", "7d",
"7e", "7f", "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "8a", "8b", "8c", "8d", "8e", "8f",
"90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "9a", "9b", "9c", "9d", "9e", "9f", "a0", "a1",
"a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "aa", "ab", "ac", "ad", "ae", "af", "b0", "b1", "b2", "b3",
"b4", "b5", "b6", "b7", "b8", "b9", "ba", "bb", "bc", "bd", "be", "bf", "c0", "c1", "c2", "c3", "c4", "c5",
"c6", "c7", "c8", "c9", "ca", "cb", "cc", "cd", "ce", "cf", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
"d8", "d9", "da", "db", "dc", "dd", "de", "df", "e0", "e1", "e2", "e3", "e4", "e5", "e6", "e7", "e8", "e9",
"ea", "eb", "ec", "ed", "ee", "ef", "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "fa", "fb",
"fc", "fd", "fe", "ff"
};
// Convert binary data sequence [beginIt, endIt) to hexadecimal string
void dataToHexString(const uint8_t*const beginIt, const uint8_t*const endIt, string& str)
{
str.clear();
str.reserve((endIt - beginIt) * 2);
for(const uint8_t* it(beginIt); it != endIt; ++it)
{
str += s_hexTable[*it];
}
}
回答by Dilushan
This will convert Hello World to 48656c6c6f20576f726c64 and printit.
这会将 Hello World 转换为 48656c6c6f20576f726c64 并打印出来。
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char hello[20]="Hello World";
for(unsigned int i=0; i<strlen(hello); i++)
cout << hex << (int) hello[i];
return 0;
}
回答by Anshul Jain
This will convert "Hello World" to "48656c6c6f20576f726c64" and will store this hex value in str1 and also will convert "48656c6c6f20576f726c64" to "Hello World".
这会将“Hello World”转换为“48656c6c6f20576f726c64”,并将此十六进制值存储在 str1 中,还将“48656c6c6f20576f726c64”转换为“Hello World”。
#include <iostream>
#include<sstream>
using namespace std;
int hexCharToInt(char);
string hexToString(string);
int main()
{
std::string str;
std::stringstream str1;
str="Hello World";
for(int i=0;i<str.length();i++){
str1 << std::hex << (int)str.at(i);
}
std::cout << str1.str() <<"\n";
string test = "48656c6c6f20576f726c64";
std::cout << hexToString(test) <<"\n";
return 0;
}
string hexToString(string str){
std::stringstream HexString;
for(int i=0;i<str.length();i++){
char a = str.at(i++);
char b = str.at(i);
int x = hexCharToInt(a);
int y = hexCharToInt(b);
HexString << (char)((16*x)+y);
}
return HexString.str();
}
int hexCharToInt(char a){
if(a>='0' && a<='9')
return(a-48);
else if(a>='A' && a<='Z')
return(a-55);
else
return(a-87);
}