我正在尝试重构一些scala代码到python3。目前卡在解码base64的字符串。Python的base64。b64decode不匹配Scala的输出。
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'Rx02xa0x0fx08hx10x00x004x01x00xd6xd6x00x000x01x00x1ax01x00x13x00x00x00x00x01x00x00x00x01x00x01x00x02x00x00x00x00x00xfaxb1>x00;Fx00x00'
#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匹配,但不知道如何从这里转换它。
任何帮助都会很感激。谢谢!
尝试在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)
你得到相同的输出…就是bytes
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)
不,是一样的。
:
b或 x02 xa0 x0f x08h x10 x00 x004 x01 x00 xd6 xd6 x00 x000 x01 x00 x1a x01 x00 * 13 x00 x00 x00 x00 x01 x00 x00 x00 x01 x00 x01 x00 x02 x00 x00 x00 x00 x00 xfa xb1> x00; F x00 x00">
:
res1:数组(字节)=数组(8 -96年82年,2日,15日,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)
实际上是完全相同的序列。
82是大写r的ascii码。因此,scala端的82
和R
(python二进制字符串中的第一个字符)都表示:"一个字节,其值为82"
第二个字节是x02
pythonside,和2 scalside。同样的事情- unicode 2字符是不可打印的,所以python使x02
。这是同一个字节
以此类推。-96与xa0相同= xa0以无符号十六进制表示,而-96表示完全相同的位序列,但将其打印为2的补码有符号二进制。撤消2的补码(消去位,加1):96 = 0110 000。翻转所有位,然后加1:1001 1111,加1:1010 0000。也就是128+32 = 160,用十六进制表示:160除以16正好是a(10)倍,所以,xa0。
末尾的70在python字符串中有一个'F',因为70是大写F的unicode,等等
一般来说,不要尝试像这样打印原始字节,因为它只会令人困惑。