データ圧縮ソフトウェアが純粋なバイナリファイルとしてファイルを読み取り、出力を行いますか?
-
29-09-2020 - |
質問
私は実装したいハイブリッド圧縮技術を持っています、私の実装は(これまで)符号化された圧縮文字列に文字列をエンコードすることができます。これらはバイナリ文字列です。たとえば、
ですテキストファイルからテキストを読み取る - >
からバイナリ文字列に変換 - >
それを符号化されたバイナリ文字列に変換します。
この時点で、エンコードされたバイナリ文字列をテキストファイルに保存できますが、一般的に行われた内容を知りたいです。
例えば、 WinRAR ソフトウェアを使用する場合は、
- 上記で言ったように読みません、任意のファイル を圧縮します。
- .rarファイルを出力 にします。
SO、コンプレッサーの「読み取り」ファイルは、純粋なバイナリ形式として、および出力ファイルをどのようにするかをどのようにしていますか?
別の方法で、私が欲しいものは、任意のファイルを純粋なバイナリ形式として読み取る方法を知り、符号化と復号化方式を持つことを考えると出力ファイルを作成することです。質問に関連するものは何でも、トピックに新たなものです。
解決
ファイルはバイトストリーム
です。OSEは鐘と笛を閉じていますが(メタデータ、またはフォーク )、ほとんどの場合、ファイルを0以上のシーケンスとして定義します。 bytes
ファイル内の各バイトは、0から255(INLUSIVE)の数値です。これ以上は何もありません。
ファイル形式は、ファイル
のバイトに意味を与える方法です。簡単な例では、白黒画像を表すファイルを持つことができ、各バイトは0(黒いピクセル)または1(白いピクセル)のいずれか(白いピクセル)で、次々とします。おそらく最初の2バイトは画像幅を16ビット数として符号化し、2番目の2バイトは高さを16ビット数としてエンコードします。
各ピクセルバイトは可能な値2~255を使用できないので、この例は非常に非効率的です。あなたは情報理論を読みたい場合があります。
「テキストファイル」はファイル形式
です。テキストファイルでは、可能なすべての値0~255には、意味、特定の文字、数、シンボル、または改行のような「特殊効果」文字が与えられます。のようなものです。厳密に言えば、 ASCII エンコーディングでは、値0~127のみが意味を持ちます。
いくつかの一般的なものしかないが、さまざまなテキストエンコーディングがあります。 Unicode 、文字は常に1バイトではありません。
しかし、ASCIIに貼りましょう。 「51A3」をテキストとして保存すると、「5」、「1」などに対応するため、バイト値53,49,97,51はファイルに入ります。
16進数0x51と0xa3を bytes として格納すると、単にそれらの2バイトがある(10進数は81,163)、これはバイト数の半分です。ただし、163がASCIIで定義されていないため、ファイルはテキストファイルではありません。
その他のファイル形式では、目的に構築されたソフトウェア
が必要です。テキストファイルは、編集者(Notepad、Nano)でそれらを開くことができるので人気があります。あなたが理解するように、彼らはあまりスペース効率ではありません。
しかしあなた自身のソフトウェアを書くことは難しくありません。これが例です。
#!/usr/bin/env python3
# PART 1 - WRITE BYTES TO A FILE
save_hex = "60b725f10c9c85c70d97880dfe8191b3"
print("Saving:", save_hex)
# group save_hex into groups of 2
save_ints = []
i = 0
while i < len(save_hex):
# the 16 makes int() treat the value as hex
integer = int(save_hex[i:i+2], 16)
save_ints.append(integer)
i+=2
print("Integer values:", save_ints)
# create a bytes object out of an array of numbers
save_raw = bytes(save_ints)
with open('myfile.raw', 'wb') as f:
f.write(save_raw)
# PART 2 - READ BYTES FROM A FILE
with open('myfile.raw', 'rb') as f:
contents = f.read()
print("Loaded: ", end='')
for byte in contents:
print('{:02x}'.format(byte), end='')
print()
.
実行した後、このチェックを行うと、16進文字列の長さの半分が長さです。また、ファイルの内容を検査するためにHexDumpツールを使用することを学びます。
pythonの bytesオブジェクトには多くの機能がありますが、基本的なアイデアを使用している場合上記(範囲0~255 - >バイトオブジェクトの範囲のintsのリスト)、(バイトオブジェクトを繰り返し、intを0~255の範囲内に入手)する必要はありません。詳細には深すぎる必要はありません。
万能圧縮ソフトウェアは通常、
を圧縮するファイルを理解していません。郵便番号またはRARにMP3ファイルを入れると、圧縮ソフトウェアは、JPEGまたはEXEファイルまたはHTMLファイルを扱うのと同じ方法でそれを一連のバイトとして扱います。