【问题标题】:How do I convert a string of decimal numbers into ASCII? [closed]如何将一串十进制数字转换为 ASCII? [关闭]
【发布时间】:2022-01-12 07:24:54
【问题描述】:

我有一个字符串,内容如下:

54565550445154544949445056555748445254555650445350485354445350535053445349565453445053564955445453535153445552494844524650504450485049474949475148445048585558501310⸮

如何将其转换为:

6872,36611,28790,46782,52056,52525,51865,25817,65535,7410,4.22,2021/11/30,20:7:2

?

【问题讨论】:

  • 请澄清,为什么第二个字符串是转换第一个字符串的结果。它们到底有什么关系?
  • 一个主要问题是ASCII是0127的值,它是一到三位数。你怎么知道5456应该只是5456,而不是5456作为单独的数字?还是5456
  • 鉴于提供的示例 看起来 OP 假设每个 ASCII 码都是两个以十为基数的数字。
  • 如果为 true,则每次遍历字符串两个字符,将这两个字符转换为 int,将该 int 转换为 char,然后将其存储在其他位置。
  • 不清楚您要做什么。尝试写下 - 尽可能具体 - 输入的结构,应该如何解释以及输入与输出的实际关系。一旦你知道了这一点,就不难找出一种算法(用笔和纸)将输入转换为输出。之后用 C++ 编码应该是最简单的部分。

标签: c++ type-conversion


【解决方案1】:

看起来您的输入是一系列 2 字节的十进制数字。每对代表一个 ascii 字符。这是一种不寻常的数据编码方式。如果输入流有任何序数值超过 99 的 ascii char,则无法对其进行编码。

快速解码循环可能如下所示。利用strtol将每对数字转换回整数。

std::string s = "54565550445154544949445056555748445254555650445350485354445350535053445349565453445053564955445453535153445552494844524650504450485049474949475148445048585558501310";
std::string result;

size_t pairs = s.length() / 2;

for (size_t i = 0; i < pairs; i++)
{
    char tmp[3] = { s[i*2], s[i*2 + 1], '\0' };

    char c = (unsigned char)(strtoul(tmp, nullptr, 10));

    result += c;
}
std::cout << result << "\n";

打印出以下内容:

6872,36611,28790,46782,52056,52525,51865,25817,65535,7410,4.22,2021/11/30,20:7:2

【讨论】:

  • 与其将长度分成两半,不如简单地将i 增加2
  • @Chris - 考虑奇数长度字符串的可能性。
  • 它只会忽略编码字符串中的最后一个字符。 for (size_t i = 0; i &lt; s.length(); i += 2) { ... }。就像你的循环一样。
  • @Chris - 也许你可以写一个更干净地处理边界情况的答案。我什至可以自己投票。
  • 这是对您答案的一个非常微不足道的修改,没有太多新颖之处。
【解决方案2】:

制作小功能来帮助您逐步解决问题总是有帮助的。 所以有一个(内联)函数可以将两个字符转换回一个字符, 另一个用于转换整个输入字符串。

#include <cassert>
#include <string>
#include <sstream>
#include <iostream>

inline char convert(const char c1, const char c2)
{
    return ((c1 - '0') * 10) + (c2 - '0');
}

std::string convert(const std::string& string)
{
    assert((string.size() & 1) == 0); // "input string must have an even length"
    std::stringstream output; 

    for(std::size_t pos=0ul; pos < string.length(); pos += 2)
    {
        // I prefer this over using std::string +=
        output << convert(string[pos], string[pos+1]);
    }

    return output.str();
}

int main()
{
    std::string input{ "54565550445154544949445056555748445254555650445350485354445350535053445349565453445053564955445453535153445552494844524650504450485049474949475148445048585558501310" };
    auto output = convert(input);
    std::cout << output;
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 2010-12-03
    相关资源
    最近更新 更多