我在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#相同的字节数组的任何建议,反之亦然。也是为什么会发生这种情况的原因?感谢。
答案 0 :(得分:1)
这些值是相同的。差别是有符号和无符号整数。您可以打印十六进制值来查看。您也应该在Android上将字节解释为无符号整数。
答案 1 :(得分:0)
经过研究后,我找到了一个更好的替代方案,在这个问题的背景下没有提到。问题是android中的字节的范围是-128到127,而c#中的字节的范围是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]。