二进制文件转化成文本文件

2024-06-24 14:08

本文主要是介绍二进制文件转化成文本文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章中如果有写错、表述不明、有疑问或者需要扩展的知识,欢迎留言或者私信~
 

1.区别

如果一个文件说是文本文件,使用任何一种文本编辑器打开可以展现出人类可读信息字符,因为编码都符合某种编码方式,如ASCII、UTF8、GB2312等等(在文件头可以读出来是什么编码方式,然后文本编辑器再按照规则去读取翻译成对应的字符,展示给我们的就是可读的了)。(关于编码方式不了解可以看这一篇)

如果一个文件说是二进制文件,肯定没有编码方式,使用某些文本编辑器可以打开,展现出来的就是可能一些乱码的字符;也有些可以读取二进制文件的,展示出来就是原始的0101这种二进制了。比如说使用UtralEdit可以显示原始的二进制文件,显示的就是原始16进制。右侧自动选了一种编码方式进行翻译成文本,比如他自动选择的就是GBK,显示出来就是乱码。

下图的例子使用UtralEdit打开的一个png格式的文件(也就是图片,本质上也是一个二进制文件):

(疑问:为什么utraledit 选择了另外一种编码方式的时候 左边的二进制的值也变了??) 

有些二进制文件使用通用的规范进行编码,有一定的标准,比如常见的图片格式JPEG,PNG,使用看图软件就能正常打开显示出图片的样子。就是二进制文件需要特殊的软件进行打开才是正确的打开方式。

有些二进制文件编码格式是程序自定义规范进行编码,对于这种二进制,只有程序的开发者自己知道该文件所对应的编码规范,进行解码使用。

可执行文件,也是文件,也是二进制文件,而对这种文件的解析就需要操作系统的参与了,涉及到可执行文件的装载等,也是有一个的规范的。可以查看《程序员的自我修养》下的文章

我们说这个文件是二进制文件,这个是文本文件,视角就是从打开这个文件程序在对文件内容的解释上。

我们使用一般的文本编辑器打开文本文件,看到的是我们认识的字符。

打开二进制文件,可能根本就打不开。

(而从计算机本身的存储的视角来看,文本文件和二进制文件都是文件,都是存储在电脑上的都是0101的二进制。只不过文本文件是把字符用某种方式解码成对应的0101这种,读取时再解码成字符)

2.如何修改二进制文件-Vim

使用vim修改:

vim -b 文件名

:%!xxd ——转化成16进制

然后进行修改二进制

:%!xxd -r——转回去

:wq

在Linux下使用vim配合xxd查看并编辑二进制文件 - killkill - 博客园

3.如何把二进制文件转化成其他文本文件,从而搜索ASCII字符

1.先使用iconv命令://IGNORE忽略那些翻译不了的

iconv -f GB2312 -t UTF-8//IGNORE {} -o $filename.text

Linux命令(35)——iconv命令 - 云+社区 - 腾讯云

2.再使用grep 对 *.text 进行搜索想要查找的ASCII字符

这篇关于二进制文件转化成文本文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1090363

相关文章

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001

剑指Offer—编程题10(二进制中1 的个数)

代码如下,请在JDK7及以上版本运行: public class Test10 {/*** 请实现一个函数, 输入一个整数,输出该数二进制表示中1的个数。* 例如把9表示成二进制是1001 ,有2位是1. 因此如果输入9,该出2。** @param n 待的数字* @return 数字中二进制表表的1的数目*/public static int numberOfOne(int

解析 flink sql 转化成flink job

文章目录 背景流程flink实例实现细节定义的规则定义的物理算子定义的flink exec node 背景 在很多计算引擎里,都会把sql 这种标准语言,转成计算引擎下底层实际的算子,因此理解此转换的流程对于理解整个过程非常重要 流程 flink实例 public class BatchExample {public static void main(String[

递归实现十进制转二进制

#include<stdio.h>#include<stdlib.h>//输入一个十进制,自己写一个函数转换为二进制//10进制转2进制:方法是除以2取余,逆序排列 //如果想转换为 8进制,则把代码中的2改为8就OK //下面这个是递归!!! void change2(int num)//如果输入num为10 {if(num==0){return ; }else{/* 不能这样写

java字符串在内存和文件中编码的不同——如何理解进制(二进制)与编码(UTF-8)的关系

不管是在内存中,还是文件中,还是网络传输中,计算机运算和存储的都只能是二进制。 内码是程序内部使用的字符编码,特别是某种语言实现其char或String类型在内存里用的内部编码;外码是程序与外部交互时外部使用的字符编码。 “外部”相对“内部”而言;不是char或String在内存里用的内部编码的地方都可以认为是“外部”。例如,外部可以是序列化之后的char或String,或者外部的文件、命令

二进制炸弹的fp是什么?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 问题描述   我在解二进制炸弹第四阶段的递归时,对主函数中的片段的理解如下: 8bc4: e3530002 cmp r3, #28bc8:

C语言笔试题:实现把一个无符号整型数字的二进制序列反序后输出

目录 题目 实例 方法一:直接交换 方法二:间接交换 拓展 题目 编写一个函数,将一个无符号整数的所有位逆序(在32位机器下) 实例 例如有一个无符号整数  unsigned int num = 32; unsigned int 在32位系统中占4个字节(32位) 32的二进制数是:       0000 0000 0000 0000 0000 0000  0010

【Rust日报】2021-7-29 与c相比,如何改善Rust巨大的二进制大小?

什么时候去使用#[inline] Reddit上有人问: 我一直在每一个我认为会经常被调用的函数上拼命地写#[inline],但这真的需要吗?inline只是提示编译器该函数可以被内联,而编译器可以忽略这一点或自行决定何时进行内联,所以我应该在什么时候用#[inline]标记我的函数?我正在制作一个使用一些自定义迭代器进行音频处理/合成的crate,我希望这些crate能快速运行。 推介阅读

C++ 统计二进制串中0出现的个数

描述 一个32位有符号整数,使用二进制来表示,现在要统计一下二进制串中'0'的个数。 示例1 输入: 11 返回值: 29 说明: 二进制00000000000000000000000000001011中有29位0 class Solution {public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param n int整

0左边必有1的二进制字符串数量

//0左边必有1的二进制字符串数量public class GetNum{//递归的解法public static int GetNum01(int n){if(n<1){return 0;}return process(1,n);}//递归函数public static int process(int i,int n){if(i==n-1){return 2;}if(i==n){ret