2016-03-30 26 views
1

kodlamak için nasıl 64 taban altı 64 bir dize dizesi kodlamaya çalışıyorum (aşağıda kopyalandı) ama kodlamak için Java8 çağrısından aldığım değerler base64'e farklı olanları eşleştirmiyorum. çevrimiçi çeviriciler.Bir hex dize

hexString.getBytes(StandardCharsets.UTF_8) 

sadece altıgen dize kodlayan EDİYOR: Bu bunu beklediğiniz yapmaz

//hexString is 07050600030102 
Base64.getEncoder().encodeToString(hexString.getBytes(StandardCharsets.UTF_8)); 

//output I am getting from Java8 ic copied below: 
MDcwNTA2MDAwMzAxMDI= 

//online converters: 
BwUGAAMBAg== 
+0

Karakter verisini (sayısal değer değil) base64 olarak kodlar. Onaltılı değeri istiyorsanız, önce bir sayı olarak ayrıştırmanız gerekir. – resueman

+0

En çok hexidecimalin kodunu çözmeniz ve kodunuzu decode kodlamak yerine base64 olarak kodlamanız gerekir. –

cevap

5

: Ben eksik adımlar (veya yanlış adımlardan aldığım) anlamaya çalışıyorum UTF-8 olarak - onaltılık dizgenin her çifti ayrıştırmak, böylece her bir çift haneli bir tek bayt olarak sona erer. Base64 sonucunun farklı olması gerçeği, base64-kodlamasını kullandığınız baytların farklı olması.

Eğer

byte[] bytes = BaseEncoding.base16().decode(hexString); 
String base64 = BaseEncoding.base64().encode(bytes); 
+0

Eğer "BaseEncoding" tek yönde kullanıyorsanız, her ikisini de kullanabilirsiniz: BaseEncoding.base64(). Kodlamak (BaseEncoding.base16(). Decode (hexString)) '. –

+0

@LouisWasserman: İyi puan :) Düzeltecek. –

+0

Teşekkür ederim Jon-Kısa bir süre sonra kabul edeceğim. Yorum yapan herkese teşekkür ederiz - –

2

Jon'un yanıt doğrudur Guava (diğer kütüphaneler arasında) kullanabilir, bayt içine bir onaltılık dize ayrıştırmak için, ama ben farklı bunu biraz açıklamak için bir girişim yapmak düşündüm. Kodlama/kod çözmenin zaman zaman biraz kafa karıştırıcı olabileceğini düşünüyorum.

Verilerinizin "hex string" olarak kodlandığını söylediğinizde, bu veriler "oldukça basılabilir" hale getirilir. Aslında, "hex encoding", yazdırmak için herhangi bir ikili veriye yapabileceğiniz en kolay şeydir. Onaltılı kodlamayla, hiçbir ikili veri yazdırılamaz (bildiğimiz bilgisayar sistemlerinde)!

Bunu daha net hale getirmek için, birisinin size "hex kodlanmış" stringi a9 (fikir 07050600030102 ile aynıdır) verdiğini varsayalım. Bu, belirli bir bayt akışını onaltılık karakterler olarak yorumlandığında, a9 olur. Altıgen karakterlerin her biri: [0-9][a-f] nibble'ı 1111 aracılığıyla kodlayabildiğinden, gerçek bitleri şu şekilde çözebilirsiniz: 1010 1001 (boş kısaltma için kullanılır). Yani, a9 olarak kodlanan hex aslında tek bir bayt 10101001'dur.

Şimdi, eğer "base64-kodlamak" olsaydı, giriş olarak 10101001 kullanmalısınız! Bayt dizisi açısından bu: {-87}: -87, Java'nın tamsayı değerlerinin iki tamamlayıcı sunumunda bit dizisinin 10101001 ondalık değeridir.

yapmanız ise (varsayılan karakter kümesi bilgisayarınızda UTF-8 ise) hexString.getBytes(StandardCharsets.UTF_8) veya hexString.getBytes(), o zaman bu kodlama UTF-8 kodlama ve yana göre yorumlanır hexString bayt almak için gidiyoruz ASCII ile uyumludur kodlama, ne olacaktı karakteri 'a' temsil 97 ondalık (veya 01100001 ikili) ilk bayt olan bir 2-bayt dizidir ve ikinci bayt karakter '9' (temsil ondalık 57, (veya ikili 00111001) 'dir ondalık 9). Böylece, getBytes() çağrısından alacağınız bayt dizisi: {97, 57}.

Gördüğünüz gibi, bu ikisi iki farklı şeydir. {-87} dizisiyle temsil edilen base64 kodlama baytlarını temel almak istiyorsunuz, ancak {97, 57} dizisiyle temsil edilen base64 kodlama baytlarını sonlandırdınız.