2012-02-16 35 views
0

如果我使用下面的方法在Javascript转换ByteArray的字符串:的Javascript C#Unicode字符串 - headscratcher

convertByteArrayToString: function(byteArray) 
{ 
    var s = ''; 
    for(var i = 0;i < byteArray.length;i++) 
      { 
        s += String.fromCharCode(byteArray[i]) 
      } 
    return s; 
}, 

如何再转换这个字符串返回到在C#中的字节数组?

我已经尝试了所有三个以下的:

System.Text.UnicodeEncoding encoding = new System.Text.UnicodeEncoding().GetBytes(myString); 
System.Text.UTF32Encoding encoding = new System.Text.UTF32Encoding().GetBytes(myString); 
System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding().GetBytes(myString); 

最接近的是第一位的,但它返回一个字节数组,它是原始的双倍长度与在所述阵列为0所有其他元素有时候会有一两个不正确的值。

据我所知,String.fromCharCode在Unicode中工作,那么如何让它与C#互操作呢?

这让我疯狂!

编辑:

下面是一个例子,

原始字节数组: [139,104,166,35,8,42,216,160,235,153,23,143,105 ,3,24,255]

My功能将其转换为: “h|#*Øëiÿ”

在C#,试图在此字符串为一个字节数组产生以下结果进行解码:

使用System.Text.UnicodeEncoding给出: [142,0,139,0,104,0,166,0,35,0,8,0,42,0,216,0,32,0,235,0,153,0,23,0,143,0,105, 0,30,24,0,255,0]

+1

这不是“长度的两倍“。 C#中的字符串是小端的UTF16,所以30个字符串的长度为60个字节。最常见的字母数字字符数低于0xFF,因此第二个(更重要)字节为0. – 2012-02-16 14:47:31

+0

重新标记,编码不是加密。 Unicode字符点可以是字符编码的,例如,使用UTF-8或UTF-16。编码是编码数据的方法(通常暗示字节),例如, Base-64或十六进制。加密是一种创建机密性的方法,例如AES。 – 2012-02-18 14:38:25

回答

2

crypto-js具有Crypto.charenc.UTF8.stringToBytes()Crypto.charenc.UTF8.bytesToString(),这与C#中的UTF-8编码完美匹配。

编辑

讨论后,事实证明,OP想从JS运送byte[]到C# - 这是通过base64编码做得更好(我建议相同JS工具包)

+0

刚刚尝试过,给了我和上面的函数一样的结果。 – 2012-02-16 15:01:38

+2

这意味着你的字节数组不是有效的UTF8字符串。也许这个问题应该以不同的方式提出:你是否想将JS中的byte []'传输到C#中?如果是这样的话,不要通过字符串去,通过base64(crypto-js也是),我们一直为加密的密码做这个,所以我想它可以工作;-) – 2012-02-16 15:04:01

+0

“不要通过字符串去,去通过base64(加密-js也)“ - 工作的一种享受,谢谢 – 2012-02-16 15:15:04