일반 텍스트 데이터를 저장하면 동등한 메시지를 바이너리로 저장하는 것보다 적은 공간을 차지합니까?


32

웹 개발자로서 바이너리 데이터에 대한 이해가 거의 없습니다.

"Hello world."라는 문장을 가져 와서 이진으로 변환하여 SQL 데이터베이스에 이진으로 저장 하면 1과 0이 문자보다 많은 공간을 차지하는 것처럼 보입니다 . 문자를 사용하는 것은 압축을 사용하는 것과 같습니다. 하나의 기호는 여러 개를 나타냅니다.

그러나 그것이 실제로 어떻게 작동합니까?

일반 텍스트 데이터를 저장하면 동등한 메시지를 바이너리로 저장하는 것보다 적은 공간을 차지합니까?


126
모든 개발자가 문자 인코딩에 대해 알아야 할 절대 최소값을 모릅니다 . 다행히도이 사이트의 설립자는 기사를 썼습니다. 다시 프로그래밍하기 전에 읽어보십시오. joelonsoftware.com/2003/10/08/…
Eric Lippert

16
@EricLippert 읽어 주셔서 감사합니다.
john doe


2
웹 개발자가 문자 인코딩 및 이진 데이터의 작동 방식을 모른다는 변명은 아닙니다. 당신은 정말 당신의 기술을 연마해야합니다 ...
T. Sar-복원 모니카

답변:


134

평문은 이진입니다.

H하드 드라이브에 쓰기를 할 때 쓰기 헤드는 두 개의 세로선과 가로선을 플래터에 새기지 않으며 비트 010010001 을 플래터에 자기 적으로 인코딩합니다 .

거기에서 일반 텍스트 데이터를 저장하는 것은 이진 데이터를 저장하는 것과 정확히 동일한 공간을 차지합니다.

그러나 평문은 하나의 두 가지 특정 이진 형식 일뿐 입니다.

평문은 다른 이진 형식으로 가역적으로 변환 될 수 있습니다. 일반적인 변환 중 하나는 압축으로, 일반적으로 같은 정보를 나타내는 데 사용되는 비트 수가 적다는보다 컴팩트 한 표현이 가능합니다.

일반 텍스트를 사용하여 나타내는 것에 따라 다른 이진 형식을 사용하여 동일한 정보를 나타낼 수 있습니다. 더 많은 공간을 사용할 수 있고 더 적은 공간을 사용할 수 있습니다.

예를 들어, 숫자 5와는 1234567디스크에 이러한 비트 시퀀스의 결과로, 숫자 문자를 사용하여 일반 텍스트로 표현 될 수 3 :

00110101 00000000
00110001 00110010 00110011 00110100 00110101 00110110 00110111 00000000

또는 32 비트 2의 보수를 사용할 수 있습니다 .

00000000 00000000 00000000 00000101
00000000 00010010 11010110 10000111

이것은 덜 간결한 표현 5이지만보다 간결한 표현입니다 1234567.

그리고 실제로는 많은 표현이 실제로 사용되는 것보다 훨씬 적지 만 다양한 수준의 압축성 및 유연성을 갖는 문자 그대로 무한한 수의 다른 표현이 있습니다.


1 UTF-8 가정. 문자의 정확한 비트 순서는 사용중인 특정 인코딩에 따라 다릅니다.

2 또는 다양한 인코딩을 고려할 때 실제로 몇 가지 형식이 있습니다 .

3 끝의 8 개의 0이 무엇인지 궁금하다면 데이터의 길이를 아는 방법이 필요합니다. 옵션은 기본적으로 마커 (널 바이트를 통해 이것을 사용했습니다), 길이를 저장하는 전용 공간 (파스칼은 바이트를 문자열의 길이를 저장하는 데 사용했습니다) 또는 고정 크기 (다음 2의 보수에 사용됨) 예).


6
약간의 차이점은 End-of-line의 표현입니다. Unix / binary에서는 1 바이트 (LF), Windows / text에서는 2 바이트 (CR-LF)가 사용됩니다.
Glenn Randers-Pehrson

97
+1 쓰기 헤드가 두 개의 수직 라인과 플래터에 수평선을 개척하지 않습니다 " .
Tulains 코르도바

@BaardKopperud 당신이 맞아요! ;)
Tulains Córdova

2
@BaardKopperud LightScribe 가 / 있지만 실제로는 컴퓨터에서 읽을 수있는 것은 아니지만 Google 고글과 같이 LightScribe 라벨을 읽을 수도 있습니다. 그러나 실제 데이터 스토리지 측면에서 그렇게하는 것은 꽤 흥미로울 것입니다. 오실로스코프를 통해 실행될 때 멋진 그래픽 이있는 노래를 상기시킵니다 .
8bittree

2
@ TulainsCórdova 실제로 Turing 기계는 임의의 알파벳으로 작동하므로 이론적으로 테이프에 글자를 쓸 있습니다. 우리는 두 기호 알파벳을 사용하여 정착했습니다.
Gardenhead

15

나는 이것이 생각하기에 매우 재미있는 일이라고 생각합니다. 이진은 당신이 그것에 대해 말하는 방식으로 1과 0이 아닙니다.

수량이 있다고 상상해보십시오. 수량은 여러 가지 방법으로 알려줄 수 있습니다.

  • Nine 영어로
  • Neuf 프랑스어
  • 9 아라비아 숫자로
  • IX 로마 숫자로
  • 1001 이진수로 아라비아 숫자
  • on off off on 이진에서 온 / 오프
  • high low low high 이진수로 전압 또는 레버 또는 수위 또는 전하로 표시됩니다 ... 또는 영어 단어 'high'및 'low'

그들은 모두 같은 것을 나타냅니다. 여기서 요점은 바이너리가 1과 0이 아니라는 것을 나타내는 유일한 방법입니다.

H를 이진으로 변환하는 것에 대해 이야기 할 때, 아마도 화면에 10101010이 보인다고 상상할 것입니다. 그러나 이것은 "이진"이 아니며, 이진 비트마다 한 자리입니다.

예, H사람들이 보통 그것에 대해 이야기 할 때 "이진"으로 변환 한 다음 아라비아 숫자로 표현한 다음 저장하면 더 많은 공간 Haitch차지하는 것과 같은 방식으로 더 많은 공간이 필요합니다.

그러나 바이너리가 수량을 나타내는 한 가지 방법이라는 것을 알 수 있습니다. "H를 이진으로 변환하고 그것을 표현하면 high low high low high low high low35자를 사용할 것입니다! "라는 논리에 10101010따르면이 둘은 '이진'입니다. .. 그래서 어떻게 다른 것보다 더 큽니까?

이것의 다른 측면이 궁금해하는 H컴퓨터에 의해 저장되고, 그보고 H같은 양 - 양을 나타내는 단지 방법 자체이다 72, 01001000또는 seventy two또는 ASCII 문자 코드 H. 일반 텍스트 이진 이라는 8 비트 트리의 대답 이지만 이것이 의미 하는 것을 보여 주려고합니다 .

컴퓨터에 약간의 패턴이 생겼으며 01001000그 의미는 무엇입니까? 무엇이든-문자로 zip 파일의 일부로 숫자로 이야기 할 수있는 것은 그것을 만든 사람의 의도에 달려 있습니다. 그것이 평문이라는 것을 안다면, 그것은 문자 인코딩에서 온 것입니다 H-> 01001000문자 인코딩 테이블에서 다른 방법으로 ASCII, UTF-8, shift-jis 등을 찾아서 올바른 글꼴을 찾으십시오. 캐릭터와 아웃은 H무엇이든 옵니다 . 또는 사용자가 만든 사람과 다른 인코딩 조회를 사용하면 잘못된 문자가 나타납니다. @Eric Lippert의 링크입니다.

그러나 이것을 쓰면서 생각할 때 H1 바이트이고 010010008 바이트입니다. 그렇습니다. 더 많은 공간입니다. 그리고 그렇습니다. 이진의 표현입니다. 그러나 컴퓨터가 사용하는 것보다 높은 수준의 추상화-ASCII 문자로 표시되는 이진-각 문자는 이진 비트 패턴으로 장면 뒤에 표시됩니다 H.


12

일반 텍스트 데이터를 저장하면 동등한 메시지를 바이너리로 저장하는 것보다 적은 공간을 차지합니까?

아뇨.

컴퓨터는 이미 일반 텍스트 데이터를 동등한 이진 표현으로 저장합니다. 일반 텍스트 대 바이너리로 무언가를 저장하면 컴퓨터가 동일한 바이너리 스트림 을 어떻게 해석해야 하는지를 알 수 있습니다 .

문자를 사용하는 것은 압축을 사용하는 것과 같습니다. 하나의 기호는 여러 개를 나타냅니다.

그것은 사실이다. 하나의 문자는 둘 이상의 비트를 나타냅니다. 문제는 크기가 다른 것입니다. 1 또는 0을 저장하는 데는 1 비트가 필요하지만 일반 텍스트 문자를 저장하는 데 8 비트 (또는 그 이상)가 필요합니다. 당신은 문자를 사용하여 아무것도 얻지 못합니다.

있다면 , 다른 방법으로 압축 할 수 있습니다. 결국 8 비트는 256 개의 서로 다른 가능한 값이지만 일반 텍스트는 일반적으로 문자, 숫자 및 몇 개의 구두점 문자로 제한됩니다. 필요한만큼의 비트가 필요하지 않습니다.


3
글쎄, 때로는 :-) 내가 생각할 수있는 두 가지 가능한 경우. 1) 압축하는 짧은 텍스트 문자열이 있습니다. 압축 파일에는 일부 메타 데이터가 포함되어있어 압축 파일을 원래 문자열보다 크게 만듭니다. 2) 부동 소수점 값이 있습니다 (예 : 1.2). 텍스트로 저장하는 것은 3 바이트 (터미네이터가있는 4)이고 이진 double을 저장하는 데는 8 바이트가 필요합니다.
jamesqf

5
대답은 실제로 '이진'의 의미에 달려 있습니다. 예를 들어, UTF-32는 ASCII보다 4 배 많은 공간을 차지하므로 '일반 텍스트'가 ASCII를 의미하고 '이진'이 UTF-32를 의미하면 일반 텍스트 이진보다 공간을 덜 차지합니다. 그러나 정의를 바꾸고 반대 결과를 얻을 수 있습니다.
David Conrad

1
@DavidConrad 글쎄, 그것은 "일반 텍스트와 같은 것은 없다"는 것입니다. 가장 가까운 것은 메타 데이터 / 헤더가없는 이진 파일로 유형을 식별하고 "XXX로 텍스트 인코딩해야합니다!"라고 추측합니다. 제한된 텍스트에서 "일반 텍스트 파일"이 합당한 것을 의미했던 시간이 있었지만 더 이상은 그렇지 않습니다. "데이터의 일부 / 모든 부분은 텍스트로 인코딩되지 않습니다"와 대조적으로 "파일의 모든 데이터는 텍스트로 인코딩됩니다"입니다.
Luaan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.