MoRanPiao 2022-10-09 16:37 采纳率: 0%
浏览 18

C++ 如何读取乱码文件内容?

本人近期在做国创项目,其中需要使用重复码,并且使用经过重复码编码后的数据进行加密。
问题是重复码编码后再读取就乱码了,而且我不知道怎么样可以读取出二进制数据
重复码代码如下:
#include <iostream>
#include <stdlib.h>
#include <string>
#include <fstream>

using namespace std;

static unsigned int inbfr,outbfr;
static FILE *outfile,*infile;
static int incnt,outcnt,mask;

void init()
{
  outbfr=0;
  outcnt=8;
  inbfr=0;
  incnt=8;
  mask=0x80;                //10000000
}

int getbit()
{
   int bitval;
   bitval=inbfr&mask;        //bitval0000000
   incnt--;                    //7
   mask >>= 1;                //01000000
   bitval >>= incnt;
   if (incnt==0)
    {
        inbfr=fgetc(infile);
        incnt=8;
        mask=0x80;
    }
   return bitval;            //0000000bitval
}

void putbit( int bitval)
{
    outbfr = (outbfr<<1)&255;    //00000000
    outbfr |= bitval;            //0000000bitval
    outcnt --;
    if (outcnt==0) 
    {
      fputc(outbfr,outfile);
      outcnt = 8;
    }
}

void alignbits()
{
  if (outcnt!=8)
  {
      for (int i=0;i<outcnt;i++)
          putbit(0);
  }
}


void decode()
{
    int n = 3;
    int bitsum;
    if ((infile = fopen("ciphertext.txt", "rb")) == NULL)
    {
        printf("cannot open infile!!!\n");
        exit(0);
    }
    if ((outfile = fopen("decryption.txt", "wb")) == NULL)
    {
        printf("cannot open outfile!!!\n");
        exit(0);
    }
    init();
    inbfr = fgetc(infile);
    while (!feof(infile))
    {
        bitsum = 0;
        for (int i = 0; i < n; i++) bitsum += getbit();
        if (bitsum >= 2) putbit(1);
        else putbit(0);
    }
    alignbits();
    fclose(infile);
    fclose(outfile);
}


void code()
{
    int n = 3;
    int bitval;
    if((infile=fopen("plaintext.txt","rb"))==NULL)
    {
        int a;
        cout << "请输入数值: ";
        cin >> a;
        ofstream file_writer("plaintext.txt", ios_base::out);
        file_writer << a;
        file_writer.close();
    }


    if ((infile = fopen("plaintext.txt", "w+")) != NULL)
    {
        int a;
        cout << "请输入数值: ";
        cin >> a;
        ofstream file_writer("plaintext.txt", ios_base::out);
        file_writer << a;
        file_writer.close();
    }


   if((outfile=fopen("ciphertext.txt","wb"))==NULL)
   {
       ofstream infile("ciphertext.txt");
   }

   

   init();
   inbfr=fgetc(infile);
   while(!feof(infile))
   {
       bitval=getbit();
       for (int i=0;i<n;i++)
           putbit(bitval);

   }
   alignbits();

   ifstream in("ciphertext.txt");
   string str;
   while (getline(in, str));
   cout << "重复码编码后的内容:   " << str << endl;   //无效读取
   in.close();

   fclose(infile);
   fclose(outfile);
}

int main() {
    code();
    decode();
}

乱码截图如下:

img

我试过网上的读取方法,我用的都不适用。
我想读取重复码编码后的二进制数据,最好是用十进制表示的二进制数 ,因为后续还要加密(例如 2 表示为 十进制的10)。求各位帮助!
  • 写回答

3条回答 默认 最新

  • 於黾 2022-10-09 16:57
    关注

    你先别搞高深的,先从基础开始学起吧
    既然涉及到加密解密,你肯定要按二进制读,而不是按字符串读呀
    https://blog.csdn.net/TIME_LEAF/article/details/115094365
    这种东西随便一搜一大把

    评论

报告相同问题?

问题事件

  • 创建了问题 10月9日

悬赏问题

  • ¥15 [vasp+phonopy]表面模型的间隙扩散系数中尝试频率如何用声子频率计算
  • ¥15 现在新建了一个f1的就不行了包括所有新建的项目都无法生成,路径命名都没问题,keil和cubemx重装过还是不行,如何解决?(标签-java|关键词-固件)
  • ¥15 web前端开发怎么实现像图片这样的页面啊?
  • ¥15 ubuntu 20.04 网卡启用后,只有ipv6 没有 ipv4 无法上网
  • ¥15 QT任务管理器无法正确获取展开,有悬赏15元速求,如何解决?(相关搜索:标识符|结构体)
  • ¥15 使用delphi 10.3+intraweb 生成的页面怎么实现自动滚屏
  • ¥20 思科:Router c3600 MN-4E插槽
  • ¥15 16进制修改视频的元数据
  • ¥15 HTML中css的位置信息居然会导致元素大小发生变化
  • ¥15 岛津txt格式文件转nirs格式