C++将字符串转换为十六进制数以及反向转换

78

在C++中,将字符串转换为十六进制以及将十六进制转换为字符串的最佳方法是什么?

例如:

  • 将类似于 "Hello World" 的字符串转换为十六进制格式:48656C6C6F20576F726C64
  • 并将十六进制 48656C6C6F20576F726C64 转换为字符串:"Hello World"

1
你所说的“to hex”具体是什么意思?难道字符串不已经是十六进制了吗? - fredoverflow
@FredOverflow:将类似于“Hello World”的字符串转换为十六进制格式:48656C6C6F20576F726C64。 - Sebtm
@0A0D:一个跨平台解决方案。 - Sebtm
14个回答

1

1
这将把“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);
}

0

这适用于打印UTF-8编码的字符串(长度可变)

// std::string
void printHex1(const std::string & str)
{
  printf("%s 1: ", str.c_str());
  for (size_t i = 0; i < str.size(); i++)
    printf("%X ", str[i]);
  printf("\n");
}

// c-style string
void printHex2(const char * buf)
{
  printf("%s 2: ", buf);
  size_t i = 0;
  while (buf[i] != 0) {
    printf("%X ", buf[i]);
    i++;
  }
  printf("\n");
}

小测试

std::string test_vector = "Cigueña";
char c_vector[128];
strncpy(c_vector, test_vector.c_str(), 128);
printHex1(test_vector);
printHex2(c_vector);

输出:

Cigueña 1: 43 69 67 75 65 FFFFFFC3 FFFFFFB1 61 
Cigueña 2: 43 69 67 75 65 FFFFFFC3 FFFFFFB1 61 

了解如何使用更多的字节编码 UTF-8 字符 ñ


-1

为什么没有人使用sprintf函数?

#include <string>
#include <stdio.h>

static const std::string str = "hello world!";

int main()
{
  //copy the data from the string to a char array
  char *strarr = new char[str.size()+1];
  strarr[str.size()+1] = 0; //set the null terminator
  memcpy(strarr, str.c_str(),str.size()); //memory copy to the char array

  printf(strarr);
  printf("\n\nHEX: ");

  //now print the data
  for(int i = 0; i < str.size()+1; i++)
  {
    char x = strarr[i];
    sprintf("%x ", reinterpret_cast<const char*>(x));
  }

  //DO NOT FORGET TO DELETE
  delete(strarr);

  return 0;
}

@Abyx 但是C++不是C的超集吗?这不意味着我们可以使用一些来自C的东西吗? - Colorless Photon
3
你实际上尝试过运行这个吗?它离正确还差得远呢。 - richvdh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接