데이터 압축 소프트웨어가 순수한 바이너리 파일로 파일을 읽고 출력을 만듭니다.
-
29-09-2020 - |
문제
구현하려는 하이브리드 압축 기술이있어, 구현은 (지금까지) 인코딩 된 압축 된 문자열로 문자열을 인코딩 할 수 있습니다.이들은 바이너리 문자열입니다.예를 들어
텍스트 파일에서 텍스트를 읽습니다 ->
이진 문자열로 변환 ->
그런 다음 인코딩 된 이진 문자열로 변환하십시오.
이 시점에서는 인코딩 된 이진 문자열을 텍스트 파일에 저장할 수 있지만 일반적으로 수행되는 것을 알고 싶습니다.
예를 들어 WinRAR 소프트웨어를 사용할 때 -
- 는 내가 위에서 말한 것처럼 읽지 않으면 파일을 압축합니다
- 는 .rar 파일을 출력으로 만듭니다
그래서 압축기가 파일을 순수한 바이너리 양식으로하는 파일과 출력 파일을 만드는 방법은 무엇입니까?
다른 방법으로, 내가 원하는 것은 파일을 순수한 바이너리 형식으로 읽고 인코딩 및 디코딩 체계가있는 출력 파일을 만드는 방법을 알아야합니다. 질문과 관련된 것의 의견을 말하면, 나는 주제에 새로운 것입니다.
해결책
파일은 바이트 스트림
입니다.OSE는 일부 종소리와 휘파람 (또는 포크 ), 대부분의 파일을 0 개 이상의 시퀀스로 정의 바이트 .
파일의 각 바이트는 0에서 255 (포함)의 숫자 값입니다. 그것에 더 이상 아무것도 없습니다.
파일 형식은 파일의 바이트에 의미를 부여하는 방법입니다
간단한 예에서는 흑백 이미지를 나타내는 파일을 가질 수 있습니다. 여기서 각 바이트는 0 (검은 픽셀) 또는 1 (흰색 픽셀)이고 다른 행 후 하나의 행입니다. 아마도 처음 두 바이트는 이미지 너비를 16 비트 숫자로 인코딩하고 두 번째 2 바이트는 높이를 16 비트 숫자로 인코딩합니다.
이 예제는 각 픽셀 바이트가 가능한 값 2-255를 결코 사용할 수 없기 때문에 매우 비효율적입니다. 정보 이론을 읽을 수 있습니다.
"텍스트 파일"은 파일 형식
입니다.텍스트 파일에서 가능한 모든 값 0-255에는 특정 문자, 숫자, 기호 또는 "특수 효과"문자가 나타납니다. 일종의. 엄격하게 말하기, ASCII 인코딩, 값 0-127만이 의미가 있습니다. 몇 가지 일반적인 것들 만 있지만 많은 다른 텍스트 인코딩이 있습니다. 유니 코드 문자는 항상 길이가 1 바이트 길이가 아닙니다.
하지만 ASCII로 막아 봅시다. "51A3"을 텍스트로 저장하면 바이트 값 53, 49, 97, 51이 "5", "1"등과 대응하여 파일로 이동합니다.
16 진수 값 0x51 및 0xA3을 바이트 으로 저장하면 단순히 2 바이트 (81, 163, 소수점에서 81, 163)이므로 바이트 수는 절반입니다. 그러나 163은 ASCII에서 정의되지 않았기 때문에 파일은 더 이상 텍스트 파일이 아닙니다.
다른 파일 형식에는 목적으로 만들어진 소프트웨어가 필요합니다
텍스트 파일은 모든 편집기 (메모장, 나노)에서 열 수 있기 때문에 인기가 있습니다. 당신이 이해할 때, 그들은 매우 공간적이 아닙니다.
그러나 자신의 소프트웨어를 작성하는 것은 어렵지 않습니다. 다음은 예제입니다.
#!/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 도구를 사용하여 파일의 내용을 검사하는 법을 배우십시오.
파이썬의 바이트 오브젝트 많은 기능을 가지고 있지만 기본 아이디어를 사용하는 경우 위 (0-255 -> 바이트 오브젝트의 ints 목록) 및 (바이트 오브젝트를 반복하고 0-255 범위를 반복하고 0-255 범위를 얻을 수 없습니다.
all 목적 압축 소프트웨어는 일반적으로
를 압축하는 파일을 이해하지 못합니다.MP3 파일을 ZIP 또는 RAR에 넣으면 압축 소프트웨어는 JPEG 또는 EXE 또는 HTML 파일을 처리하는 것과 동일한 방식으로이를 바이트 시퀀스로 처리합니다.