Düz metin verilerinin saklanması, eşdeğer iletiyi ikili dosyada saklamaktan daha az yer kaplar mı?


32

Bir web geliştiricisi olarak ikili veriyi çok az biliyorum.

"Merhaba dünya." Cümlesini alırsam, onu ikiliye dönüştürür ve bir SQL veritabanında ikili olarak depolarsam , 1'ler ve 0'lar harflerden daha fazla yer kaplar gibi görünür . Bana göre harfleri kullanmak, bir sembolün çoklu olduğu anlamına gelen sıkıştırma kullanmak gibi olacak gibi görünüyor.

Ama bu gerçekten işe yarıyor mu?

Düz metin verilerinin saklanması, eşdeğer iletiyi ikili dosyada saklamaktan daha az yer kaplar mı?


126
Bilmiyorsun her geliştirici karakter kodlaması hakkında bilmesi gereken mutlak minimum . Neyse ki bu sitenin kurucusu size bir makale yazdı. Tekrar programlamadan önce okuyun. joelonsoftware.com/2003/10/08/…
Eric Lippert

16
@EricLippert Harika bir okuma ve sonuç olarak daha iyi olduğum için teşekkür ederim.
john doe


2
Bir web geliştiricisi olmak, karakter kodlaması ve ikili verilerin nasıl çalıştığını bilmemek için bir bahane değildir. Gerçekten yeteneklerini geliştirmen gerekiyor ...
T. Sar - Monica'yı yeniden yerleştir

Yanıtlar:


134

Düz metin ikilidir.

Bir Hsabit sürücüye bir yazdığınızda, yazma kafası tablaya iki dikey çizgi ve yatay bir çizgi çizmez, bitleri 010010001 tabla içine manyetik olarak kodlar .

Oradan, düz metin verilerinin kaydedilmesinin, ikili verilerin kaydedilmesiyle aynı miktarda yer kapladığı açık olmalıdır.

Fakat düz metin sadece bir 2 özel ikili formattır.

Düz metin ters çevrilerek diğer ikili biçimlere dönüştürülebilir. Yaygın bir dönüşüm, genellikle daha kompakt bir gösterimle sonuçlanan, aynı bilgiyi temsil etmek için kullanılan daha az bit anlamına gelen sıkıştırmadır.

Düz yazıyı neyi temsil etmek için kullandığınıza bağlı olarak, aynı bilgileri temsil etmek için farklı ikili formatlar kullanabilirsiniz. Bu daha fazla alan kullanabilir, daha az kullanabilir.

Örneğin, sayılar 5ve 1234567düz metin olarak basamak karakterleri kullanılarak temsil edilebilirler, bu da disk 3'te bu bit dizilerine neden olur :

00110101 00000000
00110001 00110010 00110011 00110100 00110101 00110110 00110111 00000000

Alternatif olarak, 32 bit ikisinin tamamlayıcısını kullanabilirsiniz :

00000000 00000000 00000000 00000101
00000000 00010010 11010110 10000111

Bunun daha az kompakt bir temsili 5, fakat daha küçük bir temsilidir 1234567.

Ve uygulamada gerçekte birçok gösterimden daha az kullanılmasına rağmen, farklı seviyelerde kompaktlık ve esnekliğe sahip olacak gerçek anlamda sonsuz sayıda başka temsiller vardır.


1 UTF-8 varsayalım. Bir karakter için bitlerin tam sırası, hangi kodlamayı kullandığınıza bağlıdır.

2 Veya gerçekten, çeşitli kodlamalar verilen çeşitli biçimler .

3 Uçlardaki sekiz sıfırın ne olduğunu merak ediyorsanız, verilerin ne kadar uzun olduğunu bilmek için bir yola ihtiyacınız var. Seçenekler temel olarak bir işaretleyiciye kaynatılır (bunu boş bayt aracılığıyla kullandım), uzunluğu depolamak için ayrılmış alan (Pascal bir dizenin uzunluğunu saklamak için bir bayt kullandı) veya sabit bir boyuta (sonraki ikinin tamamlayıcısında kullanılır) örnek).


6
Küçük bir fark, Windows / metin iki bayt (CR-LF) alırken Unix / binary'de bir bayt (LF) alan Satır sonu gösterimidir.
Glenn Randers-Pehrson

97
+1 için "yazma kafası tablaya iki dikey çizgi ve yatay bir çizgi
çizmez

@BaardKopperud Haklısın! ;)
Tulains Córdova

2
@BaardKopperud LightScribe var / vardı , ancak belki de Google Goggles gibi bir şeyler bazı LightScribe etiketlerini okuyabilse de, bilgisayar okuması için pek uygun değildi. Ancak bunu gerçek veri depolama tarafında yapmak oldukça ilginç olurdu. Bana bir osiloskoptan geçerken süslü grafikleri olan şarkıları hatırlatıyor .
8

2
Teoride bu kadar TulainsCórdova olsa @ aslında, Turing makineleri, keyfi bir alfabe üzerinde işlem olabilir bant üzerine mektup yazmak. Sadece iki sembollü bir alfabe kullanmaya karar verdik.
gardenhead

15

Bunu düşünmek için çok eğlenceli bir şey buluyorum. İkili, bunun hakkında konuşma şeklinizde 1 ve 0 değildir.

Bir miktar olduğunu hayal edin, size hangi miktarın birçok farklı yoldan olduğunu söyleyebilirim:

  • Nine İngilizcede
  • Neuf Fransızcada
  • 9 Arapça rakamlarla
  • IX Romen rakamlarında
  • 1001 Arapça sayılarla Binary cinsinden
  • on off off on Açık / kapalı olan İkili cinsinden
  • high low low high Voltaj veya kaldıraç veya su seviyesi veya elektrik yükü ile temsil edilen İkili ... veya 'yüksek' ve 'düşük' İngilizce sözcükleri

Hepsi aynı şeyi temsil ediyor. Buradaki nokta, ikili değerin 1s ve 0s olmadığı, bir değeri temsil etmenin tek yoludur.

Bir H'yi ikiliye dönüştürmekten bahsederken, muhtemelen 10101010'u ekranda görmeyi hayal ediyorsunuz - ama bu "ikili" değil, her ikili bit için bir rakam.

Eğer dönüştürülen Evet, eğer Hinsanlar normal olarak bu konuda konuşmak olarak "ikili" ve ardından Arapça rakamlarla ve ardından saklanan o temsil etmek, bu dönüştürme aynı şekilde daha fazla yer alacağını Hüzere aitchdaha fazla yer alıyor.

Ancak ikilinin bir miktarı temsil etmenin bir yolu olduğunu görüyorsunuz, "H'yi ikiliye dönüştürdüysem ve onu high low high low high low high low35 karakter alacağı gibi temsil edersem ! Bu daha fazlası 10101010! Ama bu ikisi de" ikili " .. biri biri diğerinden nasıl daha büyük?

Bu diğer tarafı merak etmektir Hbir bilgisayar tarafından saklanır ve görmek Haynı miktar - Bir miktar temsil sadece bir yolu kendisi olduğunu 72, 01001000ya da seventy twoya da ASCII karakter kodu H. Hangi düz metin o 8bittree cevabı olan ikili, ama bu bana neyi göstermeye çalışıyor olduğu anlamına gelir .

Yani bir bilgisayarda biraz desen olsun 01001000ve bu ne anlama geliyor? Her şey - bir sayı olarak konuşulabilir, bir zip dosyasının bir parçası olarak, bir karakter olarak, onu oluşturan kişinin amacına göre değişir. Düz bir metin olması gerektiğini biliyorsanız, o zaman bir karakter kodlamasından geldi H-> 01001000ve siz onu karakter kodlama tablosunda - ASCII, UTF-8, shift-jis, vb. karakter ve dışarı bir Hveya her neyse gelir . Veya, onu oluşturan kişiden farklı bir kodlama araması kullanırsanız, out yanlış karakter geliyor. Bu @Eric Lippert'in bağlantısı.

Ama bunu yazdıkça ve düşündüğünüz gibi, Hbir bayt ve 010010008 bayt, evet bu daha fazla alan. Ve evet bu (bir temsili) ikili. Ancak, bilgisayarın kullandığından daha yüksek bir soyutlama düzeyindedir - ASCII karakterlerinde görüntülenen her bir karakter, her birinin Htek başına olduğu kadar büyük bir ikili bit deseniyle sahne arkasında temsil edildiği .


12

Düz metin verilerinin saklanması, eşdeğer iletiyi ikili dosyada saklamaktan daha az yer kaplar mı?

Hayır asla.

Bilgisayarınız düz metin verilerini zaten eşdeğer ikili gösterimde saklıyor. Bir şeyi ikili karşı düz metin olarak saklamak, bilgisayarın aynı ikili akışı nasıl yorumlaması gerektiğini gösterir .

Bana göre harfleri kullanmak, bir sembolün çoklu olduğu anlamına gelen sıkıştırma kullanmak gibi olacak gibi görünüyor.

Bu çok doğru. Bir karakter birden fazla biti temsil eder. Sorun, farklı büyüklükteki şeyler olmaları. 1 veya 0 değerinin kaydedilmesi sadece bir bit, düz metin karakterinin kaydedilmesi ise 8 bit (veya daha fazla) sürer. Karakterleri kullanarak hiçbir şey kazanamazsınız.

Bir şey olursa , başka yollarla işleri sıkıştırabilirsiniz. Sonuçta, 8 bit 256 farklı değerdir, ancak düz metin genellikle harfler, sayılar ve birkaç noktalama karakteri ile sınırlıdır. Gerektiği kadar bit gerektirmez.


3
Şey, belki bazen :-) Düşünebildiğim iki olası dava. 1) Sıkıştırdığınız kısa bir metin dizeniz var. Sıkıştırılmış dosya, sıkıştırılmış dosyayı orijinal dizeden daha büyük yapan bazı meta veriler içerir. 2) Bazı kayan nokta değerleriniz var 1.2. Metin olarak saklamak 3 byte (4'lü bir sonlandırıcı ile) olurken, ikili bir ikiliyi depolamak 8 byte'lıktı.
jamesqf

5
Cevap gerçekten 'ikili' ile ne demek istediğine bağlı. Örneğin, UTF-32 'düz metin' tarafından size ASCII demek eğer öyleyse, ASCII kadar alan olarak dört kez kaplıyor ve 'ikili' tarafından UTF-32, düz metin anlamına olurdu ikili daha az yer kaplar. Ancak tanımları tersine çevirebilir ve bunun karşıt sonucunu alabilirsiniz.
David Conrad

1
@DavidConrad Eh, bu sadece "düz metin diye bir şey yoktur" üzerine etekler. En yakın şey, türünü tanımlayan ve "XXX! Olarak kodlanmış metin olmalıdır" şeklinde bir meta veri / başlık içermeyen ikili bir dosyadır. "Düz metin dosyası" nın sınırlı bir bağlamda makul bir şey ifade ettiği bir zaman olmuştur, ancak artık bir anlam ifade etmemektedir. Alabileceğiniz en iyi şey "dosyadaki tüm veriler metin olarak kodlanır" ın aksine, "verilerin bazı kısımlarının tamamı / tümü metin olarak kodlanmaz" dır.
Luaan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.