scala python base64.b64decode中的输出与java的解码Base64不匹配[已关闭]

6yjfywim  于 2022-12-18  发布在  Scala
关注(0)|答案(2)|浏览(271)

**已关闭。**此问题为not reproducible or was caused by typos。当前不接受答案。

这个问题是由错字或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
3天前关闭。
Improve this question
我正在尝试将一些scala代码重构到python3中,目前还在解码base64的字符串,Python的base64.b64decode的输出与Scala的输出不匹配。
斯卡拉:

import org.apache.commons.codec.binary.Base64.decodeBase64

val coded_str = "UgKgDwhoEAAANAEA1tYAADABABoBABMAAAAAAQAAAAEAAQACAAAAAAD6sT4AO0YAAA=="
decodeBase64(coded_str)

//Output 1 :
res1: Array[Byte] = Array(82, 2, -96, 15, 8, 104, 16, 0, 0, 52, 1, 0, -42, -42, 0, 0, 48, 1, 0, 26, 1, 0, 19, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 2, 0, 0, 0, 0, 0, -6, -79, 62, 0, 59, 70, 0, 0)


coded_str.getBytes()

//Output 2
res2: Array[Byte] = Array(85, 103, 75, 103, 68, 119, 104, 111, 69, 65, 65, 65, 78, 65, 69, 65, 49, 116, 89, 65, 65, 68, 65, 66, 65, 66, 111, 66, 65, 66, 77, 65, 65, 65, 65, 65, 65, 81, 65, 65, 65, 65, 69, 65, 65, 81, 65, 67, 65, 65, 65, 65, 65, 65, 68, 54, 115, 84, 52, 65, 79, 48, 89, 65, 65, 65, 61, 61)

在Python中,我尝试:

import base64
coded_str = 'UgKgDwhoEAAANAEA1tYAADABABoBABMAAAAAAQAAAAEAAQACAAAAAAD6sT4AO0YAAA=='

print (base64.b64decode(coded_str))

#Output 1 :

b'R\x02\xa0\x0f\x08h\x10\x00\x004\x01\x00\xd6\xd6\x00\x000\x01\x00\x1a\x01\x00\x13\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x01\x00\x02\x00\x00\x00\x00\x00\xfa\xb1>\x00;F\x00\x00'

#Command 2:

b = [ord(s) for s in coded_str]
print (b)

#Output 2
[85, 103, 75, 103, 68, 119, 104, 111, 69, 65, 65, 65, 78, 65, 69, 65, 49, 116, 89, 65, 65, 68, 65, 66, 65, 66, 111, 66, 65, 66, 77, 65, 65, 65, 65, 65, 65, 81, 65, 65, 65, 65, 69, 65, 65, 81, 65, 67, 65, 65, 65, 65, 65, 65, 68, 54, 115, 84, 52, 65, 79, 48, 89, 65, 65, 65, 61, 61]

尝试从python获取输出1以匹配Scala的输出。
输出2匹配,但idk如何从这里转换它。
任何帮助都将不胜感激。谢谢!
试图在Python中得到我在Scala中看到的相同结果。

Array(82, 2, -96, 15, 8, 104, 16, 0, 0, 52, 1, 0, -42, -42, 0, 0, 48, 1, 0, 26, 1, 0, 19, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 2, 0, 0, 0, 0, 0, -6, -79, 62, 0, 59, 70, 0, 0)

kpbwa7wx

kpbwa7wx1#

你会得到相同的输出......只是字节

import base64
coded_str = 'UgKgDwhoEAAANAEA1tYAADABABoBABMAAAAAAQAAAAEAAQACAAAAAAD6sT4AO0YAAA=='

decoded_str = base64.b64decode(coded_str)

# you can get unsigned bytes by just using ord

bytes_ord = [ord(x) for x in decoded_str]

# but in java those look like signed bytes which take a tiny bit more effort...
import struct
bytes_match = struct.unpack(f"{len(decoded_str)}b",decoded_str)
print(bytes_match)
vyswwuz2

vyswwuz22#

不,这是一样的。
这一点:
b '请注意:飞
还有这个
分辨率1:数组[字节] =数组(82、2、-96、15、8、104、16、0、0、52、1、0、-42、-42、0、0、48、1、0、26、1、0、19、0、0、0、0、1、0、1、0、2、0、0、0、0、0、-6、-79、62、0、59、70、0、0)
实际上是完全相同的序列。
82是大写字母R的ascii代码,因此scala端的82R(python二进制字符串中的第一个字符)都表示:一个字节,其值为82。
第二个字节是\x02 pythonside和2 scalaside,同样的,unicode为2的字符是不可打印的,所以python把它写成\x02,这是相同的字节。
依此类推。-96与\xa0 = \xa0相同,它以无符号十六进制表示,而-96表示完全相同的位序列,但将其打印为2的补码有符号二进制。撤消2的补码(求反位,然后加1):96 = 0110 0000。翻转所有位,然后加1:1001和1111,添加1:1010 0000,即128+32 = 160,用十六进制表示:160等于16的a(10)倍所以...
python字符串末尾的70有一个“F”,因为70是大写F的unicode,等等。
一般来说,不要试图像这样打印原始字节,因为这会让人感到困惑。

相关问题