byte[] of android 转换形式 Base64 字符串不同于 c# Base64 等价

byte[] of android after conversion form Base64 string differs from c# Base64 equivalence

我在 c# 中使用以下代码

var Bytes = Convert.FromBase64String(mystring);

在 byte[] 中我得到以下值:[3,221,235,121,20,212]

但是当我 运行 在 android 中使用相同的转换时:

byte[] secretKeyByteArray=Base64.decode(mystring.getBytes("UTF-8"),Base64.DEFAULT);

我得到这些值:[3,-35,-21,121,20,-44]。 由此我了解到 android 将大于 200 的字节值转换为 -ve。关于如何在 android 中获得与在 c# 中相同的字节数组的任何建议,反之亦然。还有为什么会发生这种情况的原因?谢谢

这些值是相同的。区别是有符号和无符号整数。您可以打印十六进制值以查看。您也应该将 Android 上的字节解释为无符号整数。

经过研究,我发现了一个更好的替代方案,但未在该问题的上下文中提及。问题是 android 中的 byte 的范围是 -128 到 127 而 c# 中的 byte 的范围是 0-255 .因此它们在它们的范围内是不等价的。简而言之,android 实际上将任何大于 127 的值转换为其等效的有符号值,从而转换为差异。因为对于我的问题,我想要一个解决方案来在两种情况下提供类似的输出,所以为了我的目的,我在 c#:

中使用了以下代码
 var Bytes= Convert.FromBase64String(mystring);

            sbyte[] secSbytes = Array.ConvertAll(Bytes, b => (sbyte)b);

c#中的sbyte相当于java的字节,因为它的范围是-128到127。这解决了我的问题。通过使用此代码,我得到了 android 和 java.

的 [3,-35,-21,121,20,-44]