在C ++中使用8位ASCII字符创建7位ASCII文本字符串

时间:2017-08-09 21:50:22

标签: c++ string bitset

我希望创建一个最多46个八位字节的字符串,用7位ASCII字符填充。例如,对于字符串' Hello':

  1. 我拿了最后7位的' H' (0x48 - 100 1000)并将其放在第一个八位字节的前7位。
  2. 我接下来的字母' e' (0x65 - 110 0101),第一个位将转到第一个八位位组的最后一位,然后它将填充后续的6位八位位组。
  3. 重复1-2直到字符串结束,其余的八位字节将用1'填充。
  4. 这是我的尝试,我已经做了很多工作,我尝试使用bitset,但似乎它不适合这项任务,因为我不必一直有46个八位字节。如果字符串可以适合12(或24,36)个八位字节(并且其余部分由1' s填充),那么我不必使用46。

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    
    int main()
    {
        std::string a = "Hello";
        int N = 0;
        if (a.size() <= 11) {
            // I'm supposed to implement some logic here to check if it
            // will fit 12, 24, 36 or 46 octets but I will do it later.
            N = 80;
        }
    
        std::vector<bool> temp(N);
        int j = 0;
        for (int i = 0; i < a.size(); i++) {
            std::vector<bool> chartemp(a[i]);
    
            cout << a[i] << "\n";
            cout << chartemp[0] << "\n";
            cout << chartemp[1] << "\n";
            cout << chartemp[2] << "\n";
            cout << chartemp[3] << "\n";
            cout << chartemp[4] << "\n";
            temp[j++] = chartemp[0];
            temp[j++] = chartemp[1];
            temp[j++] = chartemp[2];
            temp[j++] = chartemp[3];
            temp[j++] = chartemp[4];
            temp[j++] = chartemp[5];
            temp[j++] = chartemp[6];
        }
    
        for (int k = j; k < N; k++) {
            temp[j++] = 1;
        }
    
        std::string s = "";
        for (int l = 0; l <= temp.size(); l++)
        {
            if (temp[l]) {
                s += '1';
            }
            else {
                s += '0';
            }
        }    
        cout << s << "\n";
    
    }
    

    结果是

    000000000000000000000000000000000001111111111111111111111111111111111111111111110
    

2 个答案:

答案 0 :(得分:2)

似乎您希望语句std::vector<bool> chartemp(a[i])i的{​​{1}}个字符作为一系列位复制到向量中。然而,向量的构造函数将值解释为初始大小,aa[i]中相应字符的ASCII值(例如a72)。因此,您很有可能创建比预期更大的向量,每个位置都使用'H'初始化。

相反,我建议使用位屏蔽:

false

而不是使用 temp[j++] = a[i] & (1 << 6); temp[j++] = a[i] & (1 << 5); temp[j++] = a[i] & (1 << 4); temp[j++] = a[i] & (1 << 3); temp[j++] = a[i] & (1 << 2); temp[j++] = a[i] & (1 << 1); temp[j++] = a[i] & (1 << 0); ,您可以使用temp[j++],从而也克服了使用正确尺寸初始化矢量的需要。

答案 1 :(得分:0)

尝试这样的事情:

#include <string>
#include <vector>

std::string stuffIt(const std::string &str, const int maxOctets)
{
    const int maxBits = maxOctets * 8;
    const int maxChars = maxBits / 7;

    if (str.size() > maxChars)
    {
        // t0o many chars to stuff into maxOctes!
        return "";
    }

    std::vector<bool> temp(maxBits);
    int idx = temp.size()-1;

    for (int i = 0; i < str.size(); ++i)
    {
        char ch = str[i];
        for(int j = 0; j < 7; ++j)
            temp[idx--] = (ch >> (6-j)) & 1;
    }

    int numBits = (((7 * str.size()) + 7) & ~7);

    for (int i = (temp.size()-numBits-1); i >= 0; --i) {
        temp[i] = 1;
    }

    std::string s;
    s.reserve(temp.size());

    for(int j = temp.size()-1; j >= 0; --j)
        s.push_back(temp[j] ? '1' : '0');

    return s;
}

stuffIt("Hello", 12)返回:

  

100100011001011101100110110011011110000011111111111111111111111111111111111111111111111111111111

stuffIt("Hello", 24)返回:

  

100100011001011101100110110011011110000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

stuffIt("Hello", 36)返回:

  

100100011001011101100110110011011110000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

stuffIt("Hello", 46)返回:

  

10010001100101110110011011001101111000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

如果你想知道给定字符串需要多少个八位字节(不添加完整的1 s的八位字节),你可以使用这个公式:

const int numChars = str.size();
const int numBits = (numChars * 7);
const int bitsNeeded = ((numBits + 7) & ~7);
const int octetsNeeded = (bitsNeeded / 8);

如果你想要额外的1,只需将octetsNeeded舍入到所需的值(例如,下一个偶数的12)。