公司因为一项目用.net调用java的webservice接口,要求把中文信息编码为base64后提交,但是用C#编码后提交上去说是错误,无论先把中文转为何种编码,不论是gb2312还是utf8 都不行,请问C#与java的base64编码结果不一致吗?我该如何处理这样的问题:C#编码代码如下 public string ToBase64(string str)
{
byte[] b = System.Text.Encoding.UTF8.GetBytes(str); return Convert.ToBase64String(b);
}
{
byte[] b = System.Text.Encoding.UTF8.GetBytes(str); return Convert.ToBase64String(b);
}
Encoding.Default.GetBytes(yourstr);看看行不行
参考
java byte : -128~127
C# byte : 0~255这样的话虽然表达到通信层上 都会根据通信适配去转换,但是由于base64是提前就编码了的所以会造成问题.这样的话 我建议 试验一下c#里的sbyte看看.不过看样子挺复杂,需要自己实现很多东西以及看懂java base64 和 C# base64 各自的实现方式
首先把byte[] 变成 sbyte[]
然后实现 sbyte[]的 base64转换base64是相同的,可以去参考下baidu c#的介绍附 byte- sbyte
对b 进行下处理
sbyte [] bSByte = new sbyte [b.Length];
for ( int i = 0 ; i < b.Length; i ++ )
{
if (b[i] > 127 )
bSByte[i] = ( sbyte )(b[i] - 256 );
else
bSByte[i] = ( sbyte )b[i];
}
我回答的草率了
对于utf8 byte-sbyte是没有意义的
因为 你接着就是 base64
没有结果
既然你是汉字转换有问题
java的默认模式是unicode 我怀疑是
utf-16
这样问题就产生了 因为 base64下 8位数据是不受符号影响的
楼主可以考虑用 unicode 先转换成 16位字节组
然后把双字节转换成 SByte组
然后sbyte组-byte组
然后 base64主要原因就是对于 231 c# 是单字节 java 是双字节
所以结果肯定不一样 ok
只要看你原始的byte数组和接受端得到的byte数组是不是一样,如果是一样那就跟base64没关系了。
java接收端的代码呢?