我有一个用Base64编码的字符串:
eJx9xEERACAIBMBKJyKDcTzR_hEsgOxjAcBQFVVNvi3qEsrRnWXwbhHOmzWnctPHPVkPu-4vBQ==
如何使用Scala语言对其进行解码?
我试图使用:
val bytes1 = new sun.misc.BASE64Decoder().decodeBuffer(compressed_code_string)
但是当我将字节数组与我在Python语言中生成的正确数组进行比较时,会出现错误。这是我在python中使用的命令:
import base64
base64.urlsafe_b64decode(compressed_code_string)
Scala中的字节数组是:
(120, -100, 125, -60, 65, 17, 0, 32, 8, 4, -64, 74, 39, 34, -125, 113, 60, -47, -2, 17, 44, -128, -20, 99, 1, -64, 80, 21, 85, 77, -66, 45, -22, 18, -54, -47, -99, 101, -16, 110, 17, -50, -101, 53, -89, 114, -45, -57, 61, 89, 15, -69, -2, 47, 5)
在python中生成的那个是:
(120, -100, 125, -60, 65, 17, 0, 32, 8, 4, -64, 74, 39, 34, -125, 113, 60, -47, -2, 17, 44, -128, -20, 99, 1, -64, 80, 21, 85, 77, -66, 45, -22, 18, -54, -47, -99, 101, -16, 110, 17, -50, -101, 53, -89, 114, -45, -57, 61, 89, 15, -69, -18, 47, 5)
请注意,数组末尾有一个区别
答案 0 :(得分:5)
遗憾的是not just one Base64 encoding。 -
字符在所有编码中的表示形式不同。例如,在MIME编码中,根本不使用它。在URL的编码中,它的值为62 - 这是Python正在使用的值。默认的sun.misc解码器希望+
为62.如果将-
更改为+
,则会得到正确答案(即Python答案)。
在Scala中,您可以将字符串s
转换为MIME格式,如下所示:
s.map{ case '-' => '+'; case '_' => '/'; case c => c }
然后Java MIME解码器将起作用。
答案 1 :(得分:4)
Python和Java在解码方面都是正确的。他们只是为此目的使用不同的RFC。 Python库使用RFC 3548
,使用过的java库使用RFC 4648
和RFC 2045
。
将连字符( - )从输入字符串更改为加号(+)将使两个解码字节数据相似。
答案 2 :(得分:2)
在scala中,将字符串编码到Base64并解码回原始字符串:
import java.util.Base64
import java.nio.charset.StandardCharsets
scala> val bytes = "foo".getBytes("UTF-8")
bytes: Array[Byte] = Array(102, 111, 111)
scala> val encoded = Base64.getEncoder().encodeToString(bytes)
encoded: String = Zm9v
scala> val decoded = Base64.getDecoder().decode(encoded)
decoded: Array[Byte] = Array(102, 111, 111)
scala> val str = new String(bytes, StandardCharsets.UTF_8)
str: String = foo