I am trying to decode the base64 string in Java like this:
package com.dolphin.client;
import com.alipay.api.internal.util.codec.Base64;
public class FeignClientApplication {
public static void main(String[] args) {
var sign = "NWityzOec6W9cGNedDWfquT2wSJfpUqLx11Re0rTrMbTJba8WOJPWtvznAnFYZci%2BEMuvUwX6ZwU%2BafuIu4xcWuujfEoX6b36K9kTOcZSC%2FmJ0rC%2FLcwbNlt%2BufYHs4hkWGhZZMUfjDWe3gOyToNOv%2BMg76keCXQ8m6gm0GqH5in8g5otfBQfMuqOxK7vYpWXJrFopNhyKv9zpZQPOmNf%2BET8Rk8Mogyz3PY2SlQcqBShUEmX4FcaVfCmTNMJd0hhFxntfFoVRjXYZwPy4knrcT1%2FW3mQcqWJwNkxiGVhd6L3dxaIZ8sMhKNbzKMjJEihLL2OlGG%2F5fmm4mM4dcoqA%3D%3D";
var result = Base64.decodeBase64(sign.getBytes());
System.out.println("result:"+ result);
}
}
This decode function come from api 'com.alipay.sdk:alipay-sdk-java:4.35.65.ALL'
.the base64 decode function in java look like this:
public static byte[] decodeBase64(byte[] base64Data) {
// RFC 2045 requires that we discard ALL non-Base64 characters
base64Data = discardNonBase64(base64Data);
// handle the edge case, so we don't have to worry about it later
if (base64Data.length == 0) {
return new byte[0];
}
int numberQuadruple = base64Data.length / FOURBYTE;
byte decodedData[] = null;
byte b1 = 0, b2 = 0, b3 = 0, b4 = 0, marker0 = 0, marker1 = 0;
// Throw away anything not in base64Data
int encodedIndex = 0;
int dataIndex = 0;
{
// this sizes the output array properly - rlw
int lastData = base64Data.length;
// ignore the '=' padding
while (base64Data[lastData - 1] == PAD) {
if (--lastData == 0) {
return new byte[0];
}
}
decodedData = new byte[lastData - numberQuadruple];
}
for (int i = 0; i < numberQuadruple; i++) {
dataIndex = i * 4;
marker0 = base64Data[dataIndex + 2];
marker1 = base64Data[dataIndex + 3];
b1 = base64Alphabet[base64Data[dataIndex]];
b2 = base64Alphabet[base64Data[dataIndex + 1]];
if (marker0 != PAD && marker1 != PAD) {
//No PAD e.g 3cQl
b3 = base64Alphabet[marker0];
b4 = base64Alphabet[marker1];
decodedData[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);
decodedData[encodedIndex + 1] =
(byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
decodedData[encodedIndex + 2] = (byte) (b3 << 6 | b4);
} else if (marker0 == PAD) {
//Two PAD e.g. 3c[Pad][Pad]
decodedData[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);
} else if (marker1 == PAD) {
//One PAD e.g. 3cQ[Pad]
b3 = base64Alphabet[marker0];
decodedData[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);
decodedData[encodedIndex + 1] =
(byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
}
encodedIndex += 3;
}
return decodedData;
}
the decode discard non base64 characters. But when I decode in rust like this:
fn main() {
let b64 = "NWityzOec6W9cGNedDWfquT2wSJfpUqLx11Re0rTrMbTJba8WOJPWtvznAnFYZci%2BEMuvUwX6ZwU%2BafuIu4xcWuujfEoX6b36K9kTOcZSC%2FmJ0rC%2FLcwbNlt%2BufYHs4hkWGhZZMUfjDWe3gOyToNOv%2BMg76keCXQ8m6gm0GqH5in8g5otfBQfMuqOxK7vYpWXJrFopNhyKv9zpZQPOmNf%2BET8Rk8Mogyz3PY2SlQcqBShUEmX4FcaVfCmTNMJd0hhFxntfFoVRjXYZwPy4knrcT1%2FW3mQcqWJwNkxiGVhd6L3dxaIZ8sMhKNbzKMjJEihLL2OlGG%2F5fmm4mM4dcoqA%3D%3D".as_bytes();
let dec = base64::decode(b64);
match dec {
Ok(data) => {
print!("data:{:?}",data);
},
Err(e) => {
print!("err:{}",e);
}
}
}
shows error:
err:Invalid byte 37, offset 64.%
does rust have some compatible way to decode base64? this base64 string is the rsa sign info. or should I write a custom base64 parse function? is it possible to make the parse result keep the same no matter we use rust or java?