当前位置:   article > 正文

2022-05-17 C++读入二进制文件并输出二进制文件_c++ 字符 二进制文件输出

c++ 字符 二进制文件输出

广告时间: 我新上了一门C语言课程 <C 语言编程核心突破> , 有入门需求的同学可以看看.


C++有各种奇怪的骚操作,今天说说其中一种。

最近看到个奇怪的需求:c++如何读入二进制文件,然后输出,意思是二进制读取,不进行任何转化,输出二进制。

从理论上讲,所有数据都是二进制的,但是很少人会将其展现出来,因为看不懂。但并不意味着这种操作毫无道理。

我们说的字符,数字,说到底不过是0101的组合,只是在于解释系统的不同,产生了不同分类。

刚学编程那会,看见有人用char代替int进行数据的计算和存储,觉得好奇怪,后来才明白,不过是0-255的数字,用int是8字节,废空间。

说回来,所有都是二进制,而二进制本身,作为最根本的数据类型,却不是最基础的类型。仔细想象,二进制类还真的满特殊的。

但不要紧,C++作为全宇宙最复杂的编程语言,还真的提供了一种近似类型,bitset,比特集合,翻译的很到位。

由于平常极少使用这种类型,它就处在知识库的犄角旮旯,这不,偶尔还真能派上用场。

常规解法

如果没有 bitset 这种类型,常规思路大概如下:

  1. 将二进制文件读到字符数组 char[ ]

  2. 对每个 char 进行位运算,将8位类似 0 0 1 1 0 1 0 1 的二进制与一个 int 1 进行 & 运算,输出结果,右移一位,继续循环。

我能想到的大概就是这种思路,当然,还可能将 4 个 char 通过位运算搞成1个unsigned int,用 cout 方法输出,但比较遗憾,cout 没有二进制输出 int 的选项,C语言的 stdio 也没有这种操作。

bitset 骚操作

既然 C++ 标准库提供了这样一种类二进制类,我们就拿来用用。

声明一点,我没有深入探究 bitset 类的实现方法,所以不能保证代码的安全性,只能说结果满足,如果要用此法进行重要程序操作,要小心。

思路:

将二进制数据读入char数组,由于所有数据都是二进制,所以char[ ] 与 bitset 只是解读形式的不同,既然如此,那么我就创造一个与字符数组一样大小的 bitset 类,并直接将字符数组的整块内存直接拷贝到 bitset 对象地址中,以这种暴力的方式进行构造。

所得到的 bitset 对象,就是解读为 0101 的形式,并可以用 cout 直接输出,毕竟这是标准库类,有完备的配套方法。

代码:环境是windows + clang64,不保证其他平台的编译实现可运行。

#include <bitset>
#include <fstream>
#include <iostream>

auto main() -> int
{
    std::ifstream fin("stu2.txt", std::ios::binary);
    char szBuf[4] = {0};
    while (fin.read(szBuf, sizeof(szBuf) - 1))
    {
        std::cout << "str = " << szBuf << std::endl;
        const int k = sizeof(szBuf) * 8;
        std::bitset<k> temp;
        memcpy(&temp, szBuf, strlen(szBuf));
        std::cout << temp << std::endl;
        memset(szBuf, 0, sizeof(szBuf));
    }
    if (fin.eof())
    {
        std::cout << "str = " << szBuf << std::endl;
        const int k = sizeof(szBuf) * 8;
        std::bitset<k> temp;
        memcpy(&temp, szBuf, strlen(szBuf));
        std::cout << temp << std::endl;
        memset(szBuf, 0, sizeof(szBuf));
    }
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

广告时间: 我新上了一门C语言课程 <C 语言编程核心突破> , 有入门需求的同学可以看看.


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/676397
推荐阅读
相关标签
  

闽ICP备14008679号