带有负片的JavaScript ascii到utf-8转换问题

带有负片的JavaScript ascii到utf-8转换问题,javascript,encryption,utf-8,ascii,Javascript,Encryption,Utf 8,Ascii,我正在解密服务器端的信息,我用另一种语言进行加密,因此知道解密应该是什么 为什么负数不正确而正数正确呢 运行示例: 输出格式: str pos S[t] str.charAt(str, pos + 1) str.charCodeAt(pos + 1) 根据GML进行解密: Input: Str: ��� Key: 472 -------------- str: ��� pos: 0 ST: 195 char: ⮫ value: -94 str: ��� pos: 1 ST: 140 char

我正在解密服务器端的信息,我用另一种语言进行加密,因此知道解密应该是什么

为什么负数不正确而正数正确呢

运行示例:

输出格式:

str
pos
S[t]
str.charAt(str, pos + 1)
str.charCodeAt(pos + 1)
根据GML进行解密:

Input:
Str: ���
Key: 472
--------------
str: ���
pos: 0
ST: 195
char: ⮫
value: -94

str: ���
pos: 1
ST: 140
char: 
value: -18

str: ���
pos: 2
ST: 136
char: 
value: -21
服务器端等效JS:

Input: 
Str: ���
Key: 472
---------------
str: ���
pos: 0
ST: 195
char: �
value: 65533

str: ���
pos: 1
ST: 140
char: �
value: 65533

str: ���
pos: 2
ST: 136
char: 
value: NaN
信息如何到达输入端: 从Server.js->Client.js传递数据,其中获取报头并将其通过一个开关站,然后使用以下方法解析数据包的其余部分:

var Parser = require('binary-parser').Parser;

login: new Parser().skip(1)
        .string("command", StringOptions)
        .string("username", StringOptions)
        .string("password", StringOptions),
然后输入到该方法: console.logrc4data.password,c.dhprivatekey

我的代码(如果需要):

function rc4(str, key) {
    var out = "";
    var len = byteCount(key);
    var S = [], j;
    var t;
    for(var i = 0; i < 256; i++) {
        S[i] = i;
    }
    j = 0;
    for( var i = 0; i< 256; i++) {

        var test = string_byte_at(key, (i % len) + 1)[0];

        if (typeof test != "number") {
        test = parseInt(test);

        }
        j = (j + S[i] + test % 256);
        temp = S[i];
        S[i] = S[j];
        S[j] = temp;
    }
    i = 0;
    j = 0;


    for (var pos = 0; pos < str.length; pos++) {
        i = (i + 1) % 256;
        j = (j + S[i]) % 256;
        var temp = S[i];
        S[i] = S[j];
        S[j] = temp;
        t = (S[i] + S[j]) % 256;
        out += str.charCodeAt(string_byte_at(str, pos + 1)[0] ^ S[t]);

    }
    return out;
    }
GML中正确工作的解密

 var str,key,out,len,i,S,j,temp,pos,t;
str = argument0;
key = string(argument1);
out = "";
len = string_byte_length(key);
for (i=0; i<256; i+=1) S[i] = i;
j = 0;
for (i=0; i<256; i+=1) {
    //show_debug_message(string_byte_at(key, (i mod len) + 1));
    j = (j + S[i] + string_byte_at(key,(i mod len)+1)) mod 256;
    temp = S[i];
    S[i] = S[j];
    S[j] = temp;
}
i = 0;
j = 0;

for (pos=0; pos < string_byte_length(str); pos+=1) {
    i = (i + 1) mod 256;
    j = (j + S[i]) mod 256;
    temp = S[i];
    S[i] = S[j];
    S[j] = temp;
    t = (S[i] + S[j]) mod 256;

    out += ansi_char(string_byte_at(str,pos+1) ^ S[t]);

}
return out;

我的代码不起作用的原因有很多: 客户端和服务器之间的连接输出无符号32位整数,同时尝试输入使密钥不相等的有符号16位整数

一旦这个问题得到解决,我得到负数的原因纯粹是因为Game Maker语言和JavaScript之间的差异

在JavaScript中,您可以将字符串与ascii进行转换,但在gml中,据我所知,他们将ascii与其他符号相结合,给出了一个从-256到256的范围,如中文、日文和拉丁文,这些符号不包括在ascii或ascii扩展中


为了解决我的问题,我必须阻止gml像这样编码,并坚持使用普通的ascii字符,这使我能够在JavaScript中正确读取和解密。

您是在尝试解密二进制值还是字符串?您得到的是正值,因为字符代码是严格非负值的。什么使您期望为负?我使用的等效输出使用一个函数,该函数返回一个字符串,其中包含设置了原始字节值的字符。它接受原始字节输入,该输入是通过获取字符串中一个字节的值获得的。原始字节输入有时是负数。idk,如果这是有用的或没有。你可以张贴加密功能,这是工作?还有,它是什么语言?不同的语言对字符串有不同的行为。字节只是位,它们没有符号,所以这里必须有其他东西。另外,您如何将信息传输到JS?这是在节点中运行,还是在浏览器中运行?添加了工作代码,如果您以前没有使用game maker,可能需要通过谷歌搜索来完成这些功能。数据是通过tcp套接字传输的,是的,这是在节点js中运行的。很高兴你找到了它。这个问题有足够多的片段,很难单独回答。