C++ 在C+中实现字母表+;

C++ 在C+中实现字母表+;,c++,alphabet,C++,Alphabet,我正在为密码做一个代码,它用二进制代码读取字母表。有没有办法实现自定义字母表(不使用ASCII)?例如,字母={a,b,c,d,e,…,z,],[,,,,,,-}每个字符都有一个数字0,1,…,63。因此,字母从字母表的元素到6位数字 如何在C++中使用简单函数实现这个?我尝试用if语句来生成字符串长度1和相应的数字,然后将它们插入到.txt文件中,但没有成功。 string str1, ..., str63; string sometext; str1 = 'a'; // ... cin

我正在为密码做一个代码,它用二进制代码读取字母表。有没有办法实现自定义字母表(不使用ASCII)?例如,字母={a,b,c,d,e,…,z,],[,,,,,,-}每个字符都有一个数字0,1,…,63。因此,字母从字母表的元素到6位数字

如何在C++中使用简单函数实现这个?我尝试用if语句来生成字符串长度1和相应的数字,然后将它们插入到.txt文件中,但没有成功。

string str1, ..., str63;
string sometext;
str1 = 'a';

// ...

cin >> sometext;
int k;
k = sometext.length();
string res;
ofstream out;
out.open("cipher.txt");
for (int i = 0; i < k; i++) {
  res = sometext.substr(i, 1);
  if (res == str1) {
    res = '000000';
  }

  // ...

  if (res == str63) {
    res = '111111';
  }
  out << res;
}
字符串str1,…,str63;
字符串sometext;
str1='a';
// ...
cin>>一些文本;
int k;
k=sometext.length();
字符串res;
流出的液体;
out.open(“cipher.txt”);
for(int i=0;i我制作了一个简单的类字母表来完成你的任务。它用于存储字符和二进制表示之间的映射,并使用此映射在这两种表示之间进行转换。它还计算二进制表示。类可以给定任何字母表

为了进行测试,我在字符和二进制之间进行了两次转换,并将结果输出到控制台。如果请求的值超出范围,则抛出std::exception


提示:拥有N个几乎相同的变量通常表示您需要一个数组或某种其他类型的容器结构。
'000000'
不是您认为的字符串。编译器会就此向您发出警告。始终启用所有警告并读取它们
#include <string>
#include <unordered_map>
#include <cmath>
#include <stdexcept>
#include <iostream>

class Alphabet {
public:
    Alphabet(std::string const & _chars)
        : chars(_chars) {
        size_t num_bits = std::ceil(std::log(std::max(size_t(1), chars.size()))
            / std::log(2) - 1e-6);
        for (size_t i = 0; i < chars.size(); ++i) {
            std::string bin;
            for (ptrdiff_t j = num_bits - 1; j >= 0; --j)
                bin += i & (1 << j) ? "1" : "0";
            c2b[chars[i]] = bin;
            b2c[bin] = chars[i];
        }
    }
    std::string ToBin(char c) const {
        auto it = c2b.find(c);
        if (it == c2b.end())
            throw std::runtime_error("Character '" +
                std::string(1, c) + "' not in alphabet!");
        return it->second;
    }
    char ToChar(std::string const & bin) const {
        auto it = b2c.find(bin);
        if (it == b2c.end())
            throw std::runtime_error("Binary '" + bin + "' is out of range!");
        return it->second;
    }
    std::string const & Chars() const {
        return chars;
    }
private:
    std::string chars;
    std::unordered_map<char, std::string> c2b;
    std::unordered_map<std::string, char> b2c;
};

int main() {
    try {
        Alphabet alph("abcdef{}123");
        std::cout << alph.ToBin('f') << std::endl;    
        std::cout << alph.ToChar("0011") << std::endl;
        std::cout << alph.Chars() << std::endl;
        return 0;
    } catch (std::exception const & ex) {
        std::cout << "Exception: " << ex.what() << std::endl;
        return -1;
    }
}
0101
d
abcdef{}123