场景:java 作为客户端调用已有的一个.net写的server的webservice,输入string,返回字节数组。
问题:返回的值不是自己想要的,跟.net客户端直接调用总是有差距
分析:平台不一样,字节表达不一样 ,经过查询之后,结果如下
.NET和Java中BYTE表达确实不一样,区别如下:
1.有符号和无符号
- c#中字节byte的范围是0~255;
- java中字节byte的范围是-128~127:
2.高低位顺序不同
- 比如16位整数10用16进制000A,在.net转换成byte数组是00 0A,而java/flash/flex等转换是0a 00
那么在.net中如何解决byte[]到sbyte[] 并能与JAVA平台等效沟通呢?
我原来一直在用Utf8编码,后来看别人发过来的文档,用Defaut的ANSI来实现即可。我~。。。。。。
/// <summary> /// DES加密解密 /// </summary> public static class IdCardDES { private static string _key; private static string _iv; static IdCardDES() { _key = "12345678"; _iv = _key; } /// <summary> /// 钥匙 /// 已做并发处理 /// 默认值12345678 /// </summary> public static string Key { get { return _key; } set { if (string.IsNullOrEmpty(value)) { return; } lock (typeof(IdCardDES)) { _key = value; } } } /// <summary> /// 向量 /// 已做并发处理 /// 默认值12345678 /// </summary> public static string IV { get { return _iv; } set { if (string.IsNullOrEmpty(value)) { return; } lock (typeof(IdCardDES)) { _iv = value; } } } /// <summary> /// 加密 /// Base64编码处理 /// </summary> /// <param name="content"></param> /// <returns></returns> public static string Encrypt(string content) { using (var des = new DESCryptoServiceProvider()) { des.Key = Encoding.ASCII.GetBytes(Key); des.IV = Encoding.ASCII.GetBytes(IV); using (var ms = new MemoryStream()) { using (var cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write)) { var inputByteArray = Encoding.Default.GetBytes(content); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); return Convert.ToBase64String(ms.ToArray()); } } } } /// <summary> /// 解密 /// Base64编码处理 /// </summary> /// <param name="content"></param> /// <returns></returns> public static string Decrypt(string content) { using (var des = new DESCryptoServiceProvider()) { des.Key = Encoding.ASCII.GetBytes(Key); des.IV = Encoding.ASCII.GetBytes(IV); using (var ms = new MemoryStream()) { using (var cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write)) { var inputByteArray = Convert.FromBase64String(content); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); return Encoding.Default.GetString(ms.ToArray()); } } } } }
参考:
- http://fred-han.iteye.com/blog/1935651
- http://www.cnblogs.com/Lawson/archive/2012/05/20/2510781.html