Neden base64 kodlu bir dizenin sonunda = işareti var?


322

base64Kodlama nedir ve nasıl base64C # kodlama hesaplamak biliyorum , ancak ben birkaç kez base64 bir dize dönüştürdüğünüzde =, sonunda bir olduğunu gördüm .

Birkaç soru geldi:

  1. Bir base64dize her zaman biter =mi?
  2. =Sonunda neden bir ekleme yapılır?

9
Bunun kesinlikle C # ile ilgisi yoktur.
BoltClock

19
Aslında c # ile ilgilidir, tüm diller = içermez, örneğin birçok perl kütüphanesi = atlar, bu nedenle kullanıcının kullandığı ortamı bilmek gerçekten önemlidir.
Jacob

Bu, bazı durumlarda oldukça tespit edilebilir olduğu için onu daha az etkili bir gizleme yöntemi yapar gibi görünüyor.
dgo

6
@ user1167442 Base64 gizleme için değil. İkili verileri (veya unicode ve diğer özel karakterleri olan dizeleri) dize olarak taşımak içindir.
NH.

Yanıtlar:


270

Dolgu görevi görür .

Daha eksiksiz bir cevap, base64 kodlu bir dizenin her zaman a =ile =bitmemesidir, dizeyi uygun uzunlukta doldurmaları gerekiyorsa yalnızca bir veya iki ile biter .


3
"Doldurma karakterlerinin gerekli olduğu bir durum birden fazla Base64 kodlu dosyayı birleştirmektir."
André Puel

1
@ AndréPuel: tek bir =kişinin resynch yeterlidir. Sınırları geri bulmak istiyorsanız, bir sonlandırıcı her zaman mevcut olmalıdır (ve yine de yalnızca bir karakter gereklidir). Base64'ün tüm dolgu konsepti sadece bir beyin parçası ...
6502

5
Ancak bu bağlantı base64 ile tamamen alakasız.
NH.

1
Keşke, dolguyu base64çizimler ve örneklerle verimli bir şekilde açıklayan ilgili ve güvenilir bir bağlantı yayınlansaydı . Vikipedi'ye şu anki bağlantı @NH gibi kesinlikle alakasız. bahsettiniz.
Fr0zenFyr

1
@ Fr0zenFyr Bir bağlantı istiyorsanız, en.wikipedia.org/wiki/Base64#Output_padding oldukça iyidir. Ancak Badr'ın cevabı gerçekten daha iyi bir cevap (henüz oylamada bulunmadı).
NH.

313

1-Hayır

2- Kısa bir cevap olarak: 65'inci karakter ("=" işareti) yalnızca bir mesajı kodlamanın son işleminde bir tamamlayıcı olarak kullanılır.

Dizinizde 3 karakterden daha fazla sayı varsa, '=' işareti olmayacaktır, çünkü Base64kodlama her üç baytı (8 bit) alır ve bunları ASCII standardında yazdırılabilir dört karakter olarak temsil eder .

Ayrıntılar:

(a) Kodlamak istiyorsanız

ABCDEFG <=> [ ABC] [ DEF] [G

Base64(bunların eksiksiz olduğu gibi) ilk blok ve ikinci (4 karakter üreten) ilgileneceğiz ancak üçüncü için duble katacak ==4 gerekli characters.Thus tamamlamak için çıktıda, sonuç olacaktır QUJD REVG Rw == (boşluksuz)

(b) Kodlamak istiyorsanız ...

ABCDEFGH <=> [ ABC] [ DEF] [GH

Benzer şekilde, =çıktının sonuna sadece bir karakter ekleyecek ve 4 karakter elde edecek sonuç QUJD REVG R0g = (boşluk olmadan) olacak


26
Bu, diğer cevap ve hatta Wikipedia'dan daha eksiksiz ve açıktır ve wikipedia bağlantısını işaret eden hiçbir şey yapmayan kabul edilen cevaptan daha fazla oyu hak etmelidir. Şeref! Upvoted!
ANewGuyInTown

2
@ANewGuyInWikipedia bağlantısını kabul edilen çözümde yanlıştır, base64 üzerindeki dolgu ile ilgisi yoktur. Doğru sayfa Legolas tarafından aşağıdaki cevabına
Fr0zenFyr


66

Gönderen Vikipedi :

Son '==' dizisi son grubun sadece bir bayt içerdiğini ve '=' iki bayt içerdiğini gösterir.

Böylece, bu bir çeşit dolgu.


16
  1. Hayır.
  2. Base64 kodlu dizeyi 4 karakter uzunluğundan birden fazlasına doldurmak için, kodu doğru şekilde çözülebilir.

3
=Sonunda kaldırdım ve bunu 1 milyon dize için test ettim . Kod çözme her zaman eşleşir.
vivek_23


11

Eşittir işareti (=) bazı base64 kodlamasında dolgu olarak kullanılır. Wikipedia makalesi base64 tüm ayrıntıları vardır.


2
"==" neden 1 bayt ve "=" 2 bayt mantığını açıklayabilir misiniz? Sadece anlayamıyorum. Girdi nasıl: "herhangi bir cinsel zevk." "YW55IGNhcm5hbCBwbGVhc3VyZS4 =", "herhangi bir carnal zevk" sonucu elde edebilir "YW55IGNhcm5hbCBwbGVhc3VyZQ =="?
null

14
'==' 1 bayt ve '=' 2 bayt değildir. Tüm dizenizde her zaman 4 baytın katları olması gerekir. Bunu elde edene kadar '=' işaretleriyle doldurursunuz. İlk dize, ikinci dizeden bir karakterden daha fazla karaktere sahiptir, bu nedenle bir tane daha az '=' dolgu gerekir.
Sam Holloway

2
Bu cevabın bir yorum olması mı gerekiyor?
Fr0zenFyr

9

Dolgu. Gönderen http://en.wikipedia.org/wiki/Base64 :

Teoride, kod çözme için dolgu karakterine gerek yoktur, çünkü eksik baytların sayısı Base64 basamaklarının sayısından hesaplanabilir. Bazı uygulamalarda dolgu karakteri zorunludur, bazıları için kullanılmaz. Doldurma karakterlerinin gerekli olduğu bir durum birden fazla Base64 kodlu dosyayı birleştirmektir.


1
"Doldurma karakterlerinin gerekli olduğu bir örnek birden fazla Base64 kodlu dosyayı birleştirmektir." Hata. Örneğin, her bir dosya için kaynak baytlarının 3 bayt uzunluğunda olduğu iki base64 dosyasını birleştirirken, base64 dizeleri 4 karakter uzunluğunda olacak ve dolgu baytları olmayacaktır. Bu iki base64 dizesini birleştirdiğinizde, birleştirilmiş dizeye nereden başlayıp diğerinin durduğunu anlamanın bir yolu yoktur. Bu yüzden yardım etmek için base64 dolgusuna güvenmek işe yaramayacak. Bayt uzunlukları 3'e eşit olarak bölünebilen herhangi bir dosya için bu sorun olacaktır.
Ron C

1
Sanırım nihai sonucun girdilerin birleşmesi olması gerektiği anlamına geliyor. örneğin decode(encode(A)+encode(B))=A+Bdolgu ile çalışır ancak onsuz çalışamaz.
Thomas Leonard

belki de bu tür sınırlı kullanım, kodlanmış dizeler bir araya getirildiğinde, kodlanmış dizelerin ayrılması genel durumu için dolgu karakterlerine güvenilmesine izin vermez. Bunu sadece bu şekilde kullanabileceğini düşünebilecek geliştiricilere yardımcı olmaktan bahsediyorum.
Ron C

1
Ben itirazınız gerçekten sadece dolgu ve sınırlama kavramları arasındaki farkı vurgular. Birleştirme sonuçlarının genellikle geri dönüşümlü hale getirmek için yeterli bilgi içermesi beklenmez. "C3dpenpsZXJz" nin aslında "c3dpenps" + "ZXJz" veya "c3dp" + "enpsZXJz" olup olmadığını bilemezsiniz. Ama aynı zamanda "swizzler" aslında "swi" + "zzlers" veya "swizzl" + "ers" olup olmadığını bilmiyorsunuz.
GargantuChet

1
Yorumumu ilgili Base64 dolgu cevabından kopyalamak :> Base64 birleşimi ['=' dolgu] ile kodlayıcıların yığın boyutlarını üçün katına hizalama yükü olmadan büyük parçaları paralel olarak işlemesine izin verir. Benzer şekilde, bir uygulama detayı olarak, üçün katı olmayan bir boyuttaki bir iç veri tamponunu yıkaması gereken bir kodlayıcı olabilir.
Andre D

7

http://www.hcidata.info/base64.htm

"Mary vardı" üssü 64 kodlama

Bu örnekte, basit bir metin dizesi kullanıyoruz ("Mary vardı"), ancak ilke, verilerin ne olduğu önemli değil (ör. Grafik dosyası). 24 bit giriş verisinin 32 bit çıkışa dönüştürülmesi için Base 64 kodlaması 24 biti 6 bitlik 4 parçaya böler. Fark ettiğimiz ilk sorun, "Mary'nin" 3 baytın katı olmadığıdır - 8 bayt uzunluğundadır. Bu nedenle, son bit grubu sadece 4 bit uzunluğundadır. Bunu düzeltmek için fazladan iki '0' biti ekliyoruz ve sonuna bir '=' koyarak bu gerçeği hatırlıyoruz. Base 64'e dönüştürülecek metin dizisi 7 bayt uzunluğunda olsaydı, son grupta 2 bit olurdu. Bu durumda, fazladan '0' bit eklerdik ve sonuna '==' koyarak bu gerçeği hatırlardık.

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.