2013-05-25 23 views
2

我使用Apache Commons庫中的Base64編碼器。現在無論是有趣的東西與我的運行/ IDE,或它們的實現Base64編碼的(或Base64作爲規範)事情是不確定性:是Base64確定性的(Apache Commons lib或其他)?

val test = Base64.encodeBase64("hello".getBytes).toString 
val test2 = Base64.encodeBase64("hello".getBytes).toString 
val test3 = Base64.encodeBase64("hello".getBytes).toString 

每一個上面產生不同的結果。這是預期的嗎?我在斯卡拉寫這...

回答

9

您已發佈的將是Scala代碼等效的Java代碼:

String test = Base64.encodeBase64("hello".getBytes()).toString(); 
String test2 = Base64.encodeBase64("hello".getBytes()).toString(); 
String test3 = Base64.encodeBase64("hello".getBytes()).toString(); 

這將打印byte[]數組對象的toString()每個Base64.encodeBase64("hello".getBytes())這將是不同的對象,因此將不同的輸出到控制檯。它執行Object類的toString()方法,根據Javadocs的說法:

返回對象的字符串表示形式。

類Object的toString方法返回一個字符串,其中包含對象爲實例的類的名稱,符號字符「@」和哈希碼的無符號十六進制表示形式目的。

要得到正確的String表示法,請使用Arrays.toString()方法。樣品Java代碼以打印正確的結果如下:

String test = Arrays.toString(Base64.encodeBase64("hello".getBytes())); 
String test2 = Arrays.toString(Base64.encodeBase64("hello".getBytes())); 
String test3 = Arrays.toString(Base64.encodeBase64("hello".getBytes())); 
+0

啊!這是我在字節數組上濫用Array.toString! D'哦!謝謝:) –

+0

只是一個提示:不要在沒有指定編碼的情況下在字符串上使用getBytes() - 特別是當您將它轉移到另一個系統時(可能是在執行base64編碼時)。否則,如果base64encoding和base64decoding發生的機器的默認編碼不同,您可能會遇到問題。 – mschenk74

+0

在Scala中做這件事的一個簡單的方法是'.toList.toString',列表總是打印它的內容而不是參考。 – pedrofurla

1

在陣列上調用toString()可能返回單獨的陣列的JVM存儲器地址從而,每個Base64.encodeBase64(的「你好」 .getBytes ())將返回不同的數組,每個數組上的toString()將返回不同的地址。

+0

不一定是內存地址。請參閱Javadocs。 – NINCOMPOOP

+0

@TheNewIdiot是的,我知道它被稱爲「身份哈希代碼」,這可以被認爲是非專業術語中的內存地址。我使用「可能」一詞的原因是, –

相關問題