我有一个充满二进制值(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
等。
答案 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());
}