我有一个看起来像这样的输入字符串:“ 126022034056098012”。这是我从某些文件中读取的符号的ASCII码加起来的结果。例如,这些代码是126 22 34 56 98 12。问题是如何将此字符串解码回字符?注意:字符串中不能包含除数字(\,|等)之外的任何分隔符。接下来我该怎么办?
我想出了一种使用ASCII符号映射的方式:键->带有ASCII符号数字表示形式的字符串,值-> ASCII符号。在循环中,我将字符串中的输入数字累积起来,直到该字符串与映射中的某个键匹配为止。匹配后,我将结果代码转换为字符。我继续直到输入数据用完。但是此方法适用于字符串和txt文件,但不适用于二进制文件。
从ASCII码字符串中生成字符串的功能:
string Utils::from_number_to_ascii(string number, int size) {
Utils ut;
while(number.size() % 3) {
number = "0" + number;
}
string out;
for (int i = 0; i < size;){
string st;
auto it = ut.triple_dict.end();
while (it == ut.triple_dict.end() && i < size){
st += number[i++];
it = ut.triple_dict.find(st);
}
out += it->second;
st = "";
}
return out;
}
填写地图:
Utils::Utils() {
for (int i = 0; i <= 255; i++){
string s = to_string(static_cast<int>(i));
if (s.size() == 1) {
s = "00" + s;
} if (s.size() == 2){
s = "0" + s;
}
triple_dict.insert(make_pair(s, static_cast<unsigned char>(i)));
}
}
不难看出我用三个字节填充了容器:如果符号的ASCII码是两位数,则将其附加“ 0”;如果符号的代码是一位数,则将其附加“ 00”代表代码三位数。我这样做是为了对符号进行明确的解码。
答案 0 :(得分:2)
如果每个ASCII码均由3位数字表示,我们可以通过循环轻松完成此操作:
std::string toAscii(char const* digits, size_t size) {
std::string output(size / 3, '\0');
for(char& c : output) {
char d0 = *digits++; // Get 3 digits
char d1 = *digits++;
char d2 = *digits++;
int ascii_value = (d0 - '0') * 100 + (d1 - '0') * 10 + (d2 - '0');
c = (char)ascii_value;
}
return output;
}
我有一个带有示例输入的c字符串,以及一个带有预期输出的字符串。该程序将验证它们是否相等。
int main() {
auto&& input = "126022034056098012";
std::string expected_output = {char(126), char(22), char(34), char(56), char(98), char(12)};
std::cout << (toAscii(input, sizeof(input)) == expected_output); // Prints true
}
否。如果您的字符串包含0个字符,则会添加它,但不会添加。我们可以使用一些非常简短的示例代码为自己测试一下。
#include <fstream>
#include <iostream>
#include <string>
int main()
{
{
std::ofstream file("test.txt");
std::string message = "Hello!";
file.write(message.data(), message.length());
// file gets closed automatically
}
{
std::ifstream file("test.txt");
while (file)
{
std::cout << file.get() << '\n';
}
// file gets closed automatically
}
}
当我编译并运行此代码时,它输出以下内容。每个值都与"Hello!"
中相应字符的值相对应,最后一个除外。 -1
表示您已到达文件末尾,但是如果使用的是file.read
之类的方法,则不会显示该文件。 \0
不会出现在文件中的任何位置。
72
101
0
108
111
33
-1