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]
我在 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]