網站首頁 編程語言 正文
計算機中文件的類別
從最本質上說,所有計算機中存儲的信息都是二進制格式,無論是一個jpg圖片,一個exe程序,一個mp4視頻或者一個txt文檔等等,對計算機而言,他們在硬盤上存的就是一堆兒一堆兒的01010011…的序列,以上所提到的不同類型的文件在硬盤上都是按0和1存儲,不同點僅在于用了多少個0和1而已。
為何要區(qū)分文本文件和二進制文件
私以為,文本文件最初出現(xiàn)時是為了人類方便閱讀而設計的,也就是人為設計一種格式來解釋0和1的組合如何被計算機所“解釋”,這種解釋規(guī)范就是字符集編碼,例如ASCII碼,UTF-8碼,當計算機按照這個編碼規(guī)則去讀取文件的時候,讀出來的就是一個一個的字符。
例如,用ASCII碼規(guī)則去解釋如下組合
二進制 01000001 01000010 01000011 01000100
十六進制 0x41 0x42 0x43 0x44
字符 A B C D
解釋出來就是“ABCD”四個字母,在文本編輯器或者控制臺上都顯示為ABCD。
如果不按照ASCII碼去解讀,它就是一個二進制文件,讀出來的就是
0x41 0x42 0x43 0x44,至于這四個數到底表示什么含義,要根據文件的類型來解釋,如果是jpg文件,它可能表示一個格式信息或者一個像素點的RGB值,如果是一個exe文件,它可能表示一個中間變量的運算結果,這就取決于用何種程序來讀取并解釋這段信息了,這就是為什么我們用視頻播放器去打開exe文件會發(fā)現(xiàn)是亂碼或者直接報錯,因為沒有用對解釋規(guī)則,這段數據頭部都不是mp4規(guī)定的頭部格式,若用視頻播放器去讀取一定會出錯。同樣的道理,用視頻播放器剪輯一個視頻并保存后,那么這段mp4視頻的文件格式一定是包含標準mp4文件的一些格式信息的,若你用另一個vlc播放器去讀取也會得到一堆亂碼,因為文件格式不符合vlc。
二進制文件又稱為流式文件,就是一個數據流,不同的程序采用不同的解釋規(guī)則來處理這個數據流,數據流可以是任意長度的,文本文件每一個字節(jié)代表一個字符,屬于流式文件的特例。
存儲方式的不同
這里可能會有讀者有疑惑,不是前文已經說了嗎,所有的信息都是以二進制方式存儲的,不區(qū)分文件類別的啊。是的,確實是這樣,你沒有錯,問題的根本在于這些二進制數我們如何去解釋,請體會這句話,閱讀數遍以上,首先我們制定一個解釋規(guī)則(例如ASCII碼表),用這個解釋規(guī)則來生成數據并存儲起來,當我們再以這個規(guī)則去讀取數據的時候,我們就能看到“原始”的數據含義。人類最偉大的發(fā)明莫過于文字,所以對于文字的處理在計算機的發(fā)展中是非常重要的研究方向,以至于我們專門為存儲和表示文字而去規(guī)定了一套規(guī)則(ASCII碼表),甚至后期為了能讓世界上各個語言的人種共享計算機的便利,發(fā)明了一套集大成的規(guī)則(UTF-8碼表),如果我們在存儲數據的時候就下意思地按照這套規(guī)則來存儲,那么儲存好的文件我們就叫它文本文件(也有一種說法叫文字文件,更為形象),文本文件是如此重要,以至于我們把它單獨拿了出來,重點關注,而把其他的圖片或者視頻程序之類的統(tǒng)稱為二進制文件,因為他們也有對應的編碼規(guī)范,但是實在太多了,不像文字統(tǒng)一性這么好,如果都去重點關注,那會累死人的,所以干脆都叫二進制文件。
所以總結以下,二進制文件的范圍是涵蓋文本文件的,只是因為文本對于我們人類來說實在太重要了,為了突出這種重要性,在存儲數據的時候刻意讓數據符合我們制定的文字規(guī)范存儲,當我們用這種規(guī)范再去讀取的數據的時候就知道它原本的含義。
舉個例子
以最簡單的txt文件為例,你在Windows系統(tǒng)下,當你在一個txt文件中寫入這樣一行字符“hello world”,第二行寫“hi man”,你把他保存起來,放到桌面上,起名字叫“new.txt”,那么它在計算機中是這樣存放的
hello world\r\n
hi man
其中\(zhòng)r\n表示一行的結束,是作為一個行結束符號,如果我們把這個字符串顯示到終端中,顯示程序讀取到這個結束符的時候就自動換行,重新開始一行進行顯示,因為控制符號是不顯示的,所以最終呈現(xiàn)出來的效果就是
hello world
hi man
但是如果以二進制的形式去讀取的話,例如我們用一些數據恢復軟件,或者winhex,hexdump軟件的話,他們是不區(qū)分文本模式的,全部按照二進制形式處理,讀出來的就會是
0x68 0x65 0x6c 0x6c 0x6f 0x20 0x77 0x6f 0x72 0x6c 0x64 0x0d 0x0a
0x68 0x69 0x20 0x6d 0x61 0x6e
注意,黃色是不顯示的,他們是格式控制字符。
注意事項
需要注意的是,任何文本文件,其存儲的值都會在0-127的范圍內,這個范圍涵蓋了格式控制符(一般不會在終端上顯示出來,但在文件中存在,作為指導程序的“指示”存在,指導程序如何控制顯示格式)和字母,數字,特殊字符。因為ASCII碼表規(guī)定好了,就是用這個范圍的數字來表示字母,數字,符號和格式控制符,如果程序以文本的格式去讀的話,例如你聲明了一個char變量,但是卻讀到了0x80(128dec),那一定會報錯的,但是如果你聲明的不是char變量,而是int變量,那程序就會認為這就是一個數值,沒有錯。
原文鏈接:https://blog.csdn.net/sygydxfwd/article/details/127013286
相關推薦
- 2022-07-11 Python內建屬性getattribute攔截器使用詳解_python
- 2022-04-25 T-SQL查詢?yōu)楹紊饔肐N和NOT?IN詳解_MsSql
- 2022-07-21 C語言運算符深入探究優(yōu)先級與結合性及種類_C 語言
- 2022-06-24 python類名和類方法cls修改類變量的值_python
- 2022-05-11 解決Spring Boot報錯Mapped Statements collection alread
- 2022-08-15 前端如何解決瀏覽器自動填充input輸入框賬號密碼的問題
- 2023-03-17 git?push時卡住的解決方法(長時間不報錯也不自動退出)_相關技巧
- 2022-05-17 bat命令實現(xiàn)批量提取、去空格、修改文件名的方法_DOS/BAT
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支