将二进制转换为ASCII

时间:2014-04-09 19:06:21

标签: c++

我有一个充满二进制值(0-1)的文本,并且我试图将其转换为ASCII,我制作了一个代码,但它没有很好地工作,这需要太长的时间和写作,这是其中的一部分:

#include <iostream>
#include <fstream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int main()
{
    ofstream fout("C:\\test.txt",ios :: binary);
    ifstream file("E:\\mnmn.txt");
    string content;
    while(file >> content)
    {
        for (size_t i = 0; i < content.size(); i++)
        {
            while((content[i] == '0') 
                    && (content[i+1] == '0')
                    && (content[i+2] == '0')
                    && (content[i+3] == '0')
                    && (content[i+4] == '0')
                    && (content[i+5] == '0')
                    && (content[i+6] == '0')
                    && (content[i+7] == '0')
            {
                char *data = "00000000";
                char c = strtol(data, 0, 2);
                fout<<c;
            }
        }
    }
}

我必须为所有值做同样的事情,即使我做了程序重复这些值,因为零和一个连接之间没有任何空格,是不是有更好的方法来转换它?

该文字包含:

00001111101010001001010101110

等。

3 个答案:

答案 0 :(得分:2)

GCC 4.8.2:g ++ -Wall -Wextra -std = c ++ 11 read-01.cpp

#include <bitset>
#include <fstream>

int main() {
  std::ofstream fout("test.txt");
  std::ifstream fin("mnmn.txt");
  char ic;
  std::bitset<8> oc;
  int i = 8;

  while (fin >> ic) {
    oc[--i] = ic - '0';

    if (0 == i) {
      fout << static_cast<char>(oc.to_ulong());
      i = 8; } }

  return 0; }

答案 1 :(得分:1)

您可以逐个字符地读取文件的内容,并在变量中累积字符。读取8个字符后,您将获得ASCII值。您的功能核心可以更改为:

int inChar = 0;
int outChar = 0;
int count = 0;;
while( (inChar = file.get()) != EOF )
{
   int x = inChar - '0';

   // Ignore newlines and other characters that are not '0' or '1'.
   if ( x == 0 || x == 1 )
   {
      // Accumulate the bit into the output char.
      outChar = (outChar << 1) + x;
      ++count;
      if ( count == 8 )
      {
         fout.put(outChar);
         outChar = 0;
         count = 0;
      }
   }
}

// Deal with unused outChar.
if ( count > 0 )
{
   cout << "There are " << count << " bits that were not used.\n";
}

答案 2 :(得分:0)

如果你想从你阅读的输入中一次得到8个字符(位),那么你应该使用std::string::substr函数,你可以直接使用结果字符串,std::stoi (或者如果你没有std::strtol)。

这样的东西
while (file >> content)
{
    do
    {
        std::string byte = content.substr(0, 8);  // Get eight "bits"

        fout << std::stoi(byte, nullptr, 2);  // Convert and output to file

        content = content.substr(8);  // The remaining bits
    } while (!content.empty());
}