데이터 압축 소프트웨어가 순수한 바이너리 파일로 파일을 읽고 출력을 만듭니다.

cs.stackexchange https://cs.stackexchange.com/questions/121856

문제

구현하려는 하이브리드 압축 기술이있어, 구현은 (지금까지) 인코딩 된 압축 된 문자열로 문자열을 인코딩 할 수 있습니다.이들은 바이너리 문자열입니다.예를 들어

텍스트 파일에서 텍스트를 읽습니다 ->

이진 문자열로 변환 ->

그런 다음 인코딩 된 이진 문자열로 변환하십시오.

이 시점에서는 인코딩 된 이진 문자열을 텍스트 파일에 저장할 수 있지만 일반적으로 수행되는 것을 알고 싶습니다.

예를 들어 WinRAR 소프트웨어를 사용할 때 -

  1. 는 내가 위에서 말한 것처럼 읽지 않으면 파일을 압축합니다
  2. 는 .rar 파일을 출력으로 만듭니다
  3. 그래서 압축기가 파일을 순수한 바이너리 양식으로하는 파일과 출력 파일을 만드는 방법은 무엇입니까?

    다른 방법으로, 내가 원하는 것은 파일을 순수한 바이너리 형식으로 읽고 인코딩 및 디코딩 체계가있는 출력 파일을 만드는 방법을 알아야합니다. 질문과 관련된 것의 의견을 말하면, 나는 주제에 새로운 것입니다.

도움이 되었습니까?

해결책

파일은 바이트 스트림

입니다.

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 파일을 처리하는 것과 동일한 방식으로이를 바이트 시퀀스로 처리합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 cs.stackexchange
scroll top