Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript编码有时会给出与C#编码不同的输出_Javascript_C#_Tobase64string - Fatal编程技术网

JavaScript编码有时会给出与C#编码不同的输出

JavaScript编码有时会给出与C#编码不同的输出,javascript,c#,tobase64string,Javascript,C#,Tobase64string,我们希望通过API登录QNAP NAS,因此需要对密码进行编码。文档中说明使用此脚本编码: 这似乎是base64编码,我希望能够用C语言编码密码,因为我们将从C语言编写的后端调用API。因此,我尝试用以下C代码测试编码: 公共静态类 { 私有常量字符串EzEncodechars=“abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz012456789+/”; 公共静态字符串Utf16to8(字符串输入) { 字节[]utf16Bytes=编码.Un

我们希望通过API登录QNAP NAS,因此需要对密码进行编码。文档中说明使用此脚本编码:

这似乎是base64编码,我希望能够用C语言编码密码,因为我们将从C语言编写的后端调用API。因此,我尝试用以下C代码测试编码:

公共静态类
{
私有常量字符串EzEncodechars=“abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz012456789+/”;
公共静态字符串Utf16to8(字符串输入)
{
字节[]utf16Bytes=编码.Unicode.GetBytes(输入);
byte[]utf8Bytes=Encoding.Convert(Encoding.Unicode,Encoding.UTF8,utf16字节);
char[]chars=(char[])Array.CreateInstance(typeof(char),utf8Bytes.Length);
for(int i=0;i
大多数测试用例都给出相同的输出。例如:“admin1234”将JavaScript代码的“YWRtaW4xMjM0”作为C#代码,并且我们的真实密码被编码为JavaScript代码和C#代码的相同值。但当我尝试将这个字符串编码为“äçè”时,输出是不同的。JavaScript返回“w6TDp8Opw6g=”但C#返回“w4pcmodwqfdg8kpw4pcqa==”

看起来utf16to8函数并不是导致不同输出的原因:JavaScript和C#都将“äçèè”转换为“ÃÃÃçÃÃÃÃè”,因此ToBase64String或GetBytes方法中似乎发生了一些不同的事情。我还尝试像这样手动编码:

    public static string Encode(string input)
    {
        //var utf8Input = Utf16to8(input);
        //var plainTextBytes = Encoding.UTF8.GetBytes(utf8Input);
        //return Convert.ToBase64String(plainTextBytes);

        var index = 0;
        var inputLength = input.Length;
        var output = "";

        while (index < inputLength)
        {
            var char1 = input[index++] & 0xff;

            if (index == inputLength)
            {
                output += EzEncodechars[char1 >> 2];
                output += EzEncodechars[(char1 & 0x3) << 4];
                output += "==";
                break;
            }

            var char2 = input[index++];

            if (index == inputLength)
            {
                output += EzEncodechars[char1 >> 2];
                output += EzEncodechars[((char1 & 0x3) << 4) | ((char2 & 0xF0) >> 4)];
                output += EzEncodechars[(char2 & 0xF) << 2];
                output += "=";
                break;
            }

            var char3 = input[index++];
            output += EzEncodechars[char1 >> 2];
            output += EzEncodechars[((char1 & 0x3) << 4) | ((char2 & 0xF0) >> 4)];
            output += EzEncodechars[((char2 & 0xF) << 2) | ((char3 & 0xC0) >> 6)];
            output += EzEncodechars[char3 & 0x3F];
        }

        return output;
    }
公共静态字符串编码(字符串输入)
{
//变量utf8Input=Utf16to8(输入);
//var plainTextBytes=Encoding.UTF8.GetBytes(utf8Input);
//返回Convert.tobase64字符串(明文字节);
var指数=0;
var inputLength=input.Length;
var输出=”;
while(索引<输入长度)
{
var char1=输入[index++]&0xff;
如果(索引==输入长度)
{
输出+=EzEncodechars[char1>>2];
输出+=EzEncodechars[(字符1和0x3)>2];
输出+=EzEncodechars[(char1&0x3)>4];
输出+=EzEncodechars[(char2&0xF)>2];
输出+=EzEncodechars[(char1&0x3)>4];
输出+=EzEncodechars[(char2&0xF)>6];
输出+=EzEncodechars[char3&0x3F];
}
返回输出;
}

但结果是一样的。我的问题是:当使用特殊字符时,是什么导致输出的差异?

我认为这可能是由于编码。您使用的是encoding.UTF8。也许可以尝试Ansii。您的代码非常迂回,编码之间以及字符串和字节之间存在大量不必要和不正确的转换。Y你不能只创建一个UTF-8字符串,因为C#中的所有字符串都是UTF-16,并且尝试将UTF-8字节键入UTF-16字符无法工作。只需执行
var utf8=Encoding.utf8.GetBytes(input);var base64=Convert.ToBase64String(utf8);
获取字符串UTF8表示形式的base64编码。感谢您的回答。我将尝试研究它。我还注意到我忘记了如何调用JavaScript函数。我是这样做的:
console.log(“加密密码:+ezEncode(utf16to8(密码));
    public static string Encode(string input)
    {
        //var utf8Input = Utf16to8(input);
        //var plainTextBytes = Encoding.UTF8.GetBytes(utf8Input);
        //return Convert.ToBase64String(plainTextBytes);

        var index = 0;
        var inputLength = input.Length;
        var output = "";

        while (index < inputLength)
        {
            var char1 = input[index++] & 0xff;

            if (index == inputLength)
            {
                output += EzEncodechars[char1 >> 2];
                output += EzEncodechars[(char1 & 0x3) << 4];
                output += "==";
                break;
            }

            var char2 = input[index++];

            if (index == inputLength)
            {
                output += EzEncodechars[char1 >> 2];
                output += EzEncodechars[((char1 & 0x3) << 4) | ((char2 & 0xF0) >> 4)];
                output += EzEncodechars[(char2 & 0xF) << 2];
                output += "=";
                break;
            }

            var char3 = input[index++];
            output += EzEncodechars[char1 >> 2];
            output += EzEncodechars[((char1 & 0x3) << 4) | ((char2 & 0xF0) >> 4)];
            output += EzEncodechars[((char2 & 0xF) << 2) | ((char3 & 0xC0) >> 6)];
            output += EzEncodechars[char3 & 0x3F];
        }

        return output;
    }