如何将带有双反斜杠的字符串转换为单反斜杠
Posted
技术标签:
【中文标题】如何将带有双反斜杠的字符串转换为单反斜杠【英文标题】:How to convert string with double backslashes to single backslahses 【发布时间】:2019-12-18 23:26:34 【问题描述】:如何转换以下字符串:
std::string s = "\\xfc\\xe8\\x82"
到等效的 char 数组:
char s[] = "\xfc\xe8\x82"
【问题讨论】:
为了确定,您知道"\x00\x00\x00"
是一个由 3 个零组成的 char 数组,后跟终止的 null 吗?
所以你的问题是——原始字符串是如何以“不好”的方式格式化的。我认为我们遗漏了一些细节。什么程序将伪造的斜线字符粘贴到原始字符串上?如果这是原始字符串的外观,那么您需要修复以这种方式为您提供字符串的程序。还是您误解了字符串和转义字符在 C++ 源代码中的工作方式?
您面临的实际问题是什么?
【参考方案1】:
也许对字符串文字中的转义字符存在普遍的误解。
作为字符串的文字"\\xfc\\xe8\\x82"
使用“\”作为转义字符。 “\”将减少为“\”。如你所料。因此,如果您打印给定的std::string
,那么结果将是:
\xfc\xe8\x82
.
所以,您现在要做的是:创建一个包含这些十六进制值的 char 数组,在原始 std::string
中给出。
请注意:您的声明 char s[] = "\xfc\xe8\x82";
将创建一个 C 样式的 char 数组,大小为 4 并包含:
s[0]=fc, s[1]=e8, s[2]=82, s[3]=0
在下面的示例中,我展示了 2 个转换建议。 1. 直接转换 2.使用C++标准算法
#include <string>
#include <iostream>
#include <iomanip>
#include <regex>
#include <vector>
#include <iterator>
#include <algorithm>
// Hex digit String
std::regex hexValueR"(\\[xX]([0-9a-fA-F][0-9a-fA-F]))";
int main ()
// Source string
std::string s1 = "\\xfc\\xe8\\x82";
std::cout << "s 1: " << s1 << "\n";
// Proposal 1 ------------------------------------------------------
// Target array
unsigned char s2[3];
// Convert bytes from strings
for (int i=0; i<s1.size()/4; ++i )
// Do conversion. Isolate substring, the convert
s2[i] = std::strtoul(s1.substr(i*4+2,2).c_str(), nullptr,16);
// Result is now in s2
// Output value as tring and decimal value
std::cout << s1.substr(i*4+2,2) << " -> " << std::hex << static_cast <unsigned short>(s2[i])
<< " -> " << std::dec << static_cast <unsigned short>(s2[i]) << "\n";
// Proposal 2 ------------------------------------------------------
// Get the tokens
std::vector<std::string> vstr(std::sregex_token_iterator(s1.begin(),s1.end(),hexValue, 1), );
// Convert to unsigned int
std::vector<unsigned int> vals;
std::transform(vstr.begin(), vstr.end(), std::back_inserter(vals),
[](std::string &s) return static_cast<unsigned>(std::strtoul(s.c_str(), nullptr,16)); );
std::copy(vals.begin(), vals.end(), std::ostream_iterator<unsigned>(std::cout,"\n"));
return 0;
第二种解决方案将吃掉字符串中给出的任意数量的十六进制数字
【讨论】:
以上是关于如何将带有双反斜杠的字符串转换为单反斜杠的主要内容,如果未能解决你的问题,请参考以下文章
python input()键盘输入8583报文带有x单反斜杠自动转义问题解决办法
Python 3.6,utf-8 到 unicode 的转换,带双反斜杠的字符串