網(wǎng)站首頁 編程語言 正文
計(jì)算機(jī)中文件的類別
從最本質(zhì)上說,所有計(jì)算機(jī)中存儲的信息都是二進(jìn)制格式,無論是一個(gè)jpg圖片,一個(gè)exe程序,一個(gè)mp4視頻或者一個(gè)txt文檔等等,對計(jì)算機(jī)而言,他們在硬盤上存的就是一堆兒一堆兒的01010011…的序列,以上所提到的不同類型的文件在硬盤上都是按0和1存儲,不同點(diǎn)僅在于用了多少個(gè)0和1而已。
為何要區(qū)分文本文件和二進(jìn)制文件
私以為,文本文件最初出現(xiàn)時(shí)是為了人類方便閱讀而設(shè)計(jì)的,也就是人為設(shè)計(jì)一種格式來解釋0和1的組合如何被計(jì)算機(jī)所“解釋”,這種解釋規(guī)范就是字符集編碼,例如ASCII碼,UTF-8碼,當(dāng)計(jì)算機(jī)按照這個(gè)編碼規(guī)則去讀取文件的時(shí)候,讀出來的就是一個(gè)一個(gè)的字符。
例如,用ASCII碼規(guī)則去解釋如下組合
二進(jìn)制 01000001 01000010 01000011 01000100
十六進(jìn)制 0x41 0x42 0x43 0x44
字符 A B C D
解釋出來就是“ABCD”四個(gè)字母,在文本編輯器或者控制臺上都顯示為ABCD。
如果不按照ASCII碼去解讀,它就是一個(gè)二進(jìn)制文件,讀出來的就是
0x41 0x42 0x43 0x44,至于這四個(gè)數(shù)到底表示什么含義,要根據(jù)文件的類型來解釋,如果是jpg文件,它可能表示一個(gè)格式信息或者一個(gè)像素點(diǎn)的RGB值,如果是一個(gè)exe文件,它可能表示一個(gè)中間變量的運(yùn)算結(jié)果,這就取決于用何種程序來讀取并解釋這段信息了,這就是為什么我們用視頻播放器去打開exe文件會發(fā)現(xiàn)是亂碼或者直接報(bào)錯(cuò),因?yàn)闆]有用對解釋規(guī)則,這段數(shù)據(jù)頭部都不是mp4規(guī)定的頭部格式,若用視頻播放器去讀取一定會出錯(cuò)。同樣的道理,用視頻播放器剪輯一個(gè)視頻并保存后,那么這段mp4視頻的文件格式一定是包含標(biāo)準(zhǔn)mp4文件的一些格式信息的,若你用另一個(gè)vlc播放器去讀取也會得到一堆亂碼,因?yàn)槲募袷讲环蟰lc。
二進(jìn)制文件又稱為流式文件,就是一個(gè)數(shù)據(jù)流,不同的程序采用不同的解釋規(guī)則來處理這個(gè)數(shù)據(jù)流,數(shù)據(jù)流可以是任意長度的,文本文件每一個(gè)字節(jié)代表一個(gè)字符,屬于流式文件的特例。
存儲方式的不同
這里可能會有讀者有疑惑,不是前文已經(jīng)說了嗎,所有的信息都是以二進(jìn)制方式存儲的,不區(qū)分文件類別的啊。是的,確實(shí)是這樣,你沒有錯(cuò),問題的根本在于這些二進(jìn)制數(shù)我們?nèi)绾稳ソ忉?,請?bào)w會這句話,閱讀數(shù)遍以上,首先我們制定一個(gè)解釋規(guī)則(例如ASCII碼表),用這個(gè)解釋規(guī)則來生成數(shù)據(jù)并存儲起來,當(dāng)我們再以這個(gè)規(guī)則去讀取數(shù)據(jù)的時(shí)候,我們就能看到“原始”的數(shù)據(jù)含義。人類最偉大的發(fā)明莫過于文字,所以對于文字的處理在計(jì)算機(jī)的發(fā)展中是非常重要的研究方向,以至于我們專門為存儲和表示文字而去規(guī)定了一套規(guī)則(ASCII碼表),甚至后期為了能讓世界上各個(gè)語言的人種共享計(jì)算機(jī)的便利,發(fā)明了一套集大成的規(guī)則(UTF-8碼表),如果我們在存儲數(shù)據(jù)的時(shí)候就下意思地按照這套規(guī)則來存儲,那么儲存好的文件我們就叫它文本文件(也有一種說法叫文字文件,更為形象),文本文件是如此重要,以至于我們把它單獨(dú)拿了出來,重點(diǎn)關(guān)注,而把其他的圖片或者視頻程序之類的統(tǒng)稱為二進(jìn)制文件,因?yàn)樗麄円灿袑?yīng)的編碼規(guī)范,但是實(shí)在太多了,不像文字統(tǒng)一性這么好,如果都去重點(diǎn)關(guān)注,那會累死人的,所以干脆都叫二進(jìn)制文件。
所以總結(jié)以下,二進(jìn)制文件的范圍是涵蓋文本文件的,只是因?yàn)槲谋緦τ谖覀內(nèi)祟悂碚f實(shí)在太重要了,為了突出這種重要性,在存儲數(shù)據(jù)的時(shí)候刻意讓數(shù)據(jù)符合我們制定的文字規(guī)范存儲,當(dāng)我們用這種規(guī)范再去讀取的數(shù)據(jù)的時(shí)候就知道它原本的含義。
舉個(gè)例子
以最簡單的txt文件為例,你在Windows系統(tǒng)下,當(dāng)你在一個(gè)txt文件中寫入這樣一行字符“hello world”,第二行寫“hi man”,你把他保存起來,放到桌面上,起名字叫“new.txt”,那么它在計(jì)算機(jī)中是這樣存放的
hello world\r\n
hi man
其中\(zhòng)r\n表示一行的結(jié)束,是作為一個(gè)行結(jié)束符號,如果我們把這個(gè)字符串顯示到終端中,顯示程序讀取到這個(gè)結(jié)束符的時(shí)候就自動(dòng)換行,重新開始一行進(jìn)行顯示,因?yàn)榭刂品柺遣伙@示的,所以最終呈現(xiàn)出來的效果就是
hello world
hi man
但是如果以二進(jìn)制的形式去讀取的話,例如我們用一些數(shù)據(jù)恢復(fù)軟件,或者winhex,hexdump軟件的話,他們是不區(qū)分文本模式的,全部按照二進(jìn)制形式處理,讀出來的就會是
0x68 0x65 0x6c 0x6c 0x6f 0x20 0x77 0x6f 0x72 0x6c 0x64 0x0d 0x0a
0x68 0x69 0x20 0x6d 0x61 0x6e
注意,黃色是不顯示的,他們是格式控制字符。
注意事項(xiàng)
需要注意的是,任何文本文件,其存儲的值都會在0-127的范圍內(nèi),這個(gè)范圍涵蓋了格式控制符(一般不會在終端上顯示出來,但在文件中存在,作為指導(dǎo)程序的“指示”存在,指導(dǎo)程序如何控制顯示格式)和字母,數(shù)字,特殊字符。因?yàn)锳SCII碼表規(guī)定好了,就是用這個(gè)范圍的數(shù)字來表示字母,數(shù)字,符號和格式控制符,如果程序以文本的格式去讀的話,例如你聲明了一個(gè)char變量,但是卻讀到了0x80(128dec),那一定會報(bào)錯(cuò)的,但是如果你聲明的不是char變量,而是int變量,那程序就會認(rèn)為這就是一個(gè)數(shù)值,沒有錯(cuò)。
原文鏈接:https://blog.csdn.net/sygydxfwd/article/details/127013286
相關(guān)推薦
- 2022-08-10 詳細(xì)講解Swift中的類型占位符_Swift
- 2023-01-01 用幾行C#代碼實(shí)現(xiàn)定時(shí)關(guān)機(jī)/重啟(超詳細(xì)!建議新手練習(xí))_C#教程
- 2022-10-11 XGBoost與GBDT和LGBM區(qū)別
- 2022-05-13 使用openmp為循環(huán)邏輯提速
- 2022-02-09 C語言指針用法總結(jié)_C 語言
- 2022-04-24 解決redis在linux上的部署的問題_Redis
- 2022-04-12 Error: Rule can only have one resource source (pro
- 2023-04-06 sql?server?2008數(shù)據(jù)庫不能添加附加文件的解決方法_mssql2008
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支