赞
踩
广告时间: 我新上了一门C语言课程 <C 语言编程核心突破> , 有入门需求的同学可以看看.
最近看到个奇怪的需求:c++如何读入二进制文件,然后输出,意思是二进制读取,不进行任何转化,输出二进制。
从理论上讲,所有数据都是二进制的,但是很少人会将其展现出来,因为看不懂。但并不意味着这种操作毫无道理。
我们说的字符,数字,说到底不过是0101的组合,只是在于解释系统的不同,产生了不同分类。
刚学编程那会,看见有人用char代替int进行数据的计算和存储,觉得好奇怪,后来才明白,不过是0-255的数字,用int是8字节,废空间。
说回来,所有都是二进制,而二进制本身,作为最根本的数据类型,却不是最基础的类型。仔细想象,二进制类还真的满特殊的。
但不要紧,C++作为全宇宙最复杂的编程语言,还真的提供了一种近似类型,bitset,比特集合,翻译的很到位。
由于平常极少使用这种类型,它就处在知识库的犄角旮旯,这不,偶尔还真能派上用场。
如果没有 bitset 这种类型,常规思路大概如下:
将二进制文件读到字符数组 char[ ]
对每个 char 进行位运算,将8位类似 0 0 1 1 0 1 0 1 的二进制与一个 int 1 进行 & 运算,输出结果,右移一位,继续循环。
我能想到的大概就是这种思路,当然,还可能将 4 个 char 通过位运算搞成1个unsigned int,用 cout 方法输出,但比较遗憾,cout 没有二进制输出 int 的选项,C语言的 stdio 也没有这种操作。
既然 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;
}
广告时间: 我新上了一门C语言课程 <C 语言编程核心突破> , 有入门需求的同学可以看看.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。