Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.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 不同语言中相同代码的不同行为_Javascript_C++_Xxtea - Fatal编程技术网

Javascript 不同语言中相同代码的不同行为

Javascript 不同语言中相同代码的不同行为,javascript,c++,xxtea,Javascript,C++,Xxtea,我正在尝试用Javascript(Node.js)解密。我尝试在C++中做同样的事情,它的工作与预期一样: #define DELTA 0x9e3779b9 #define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z))) #define CRYPT_WORDS (64-4)/4 #define CRYPT_OFFSET 1 void btea_decry

我正在尝试用Javascript(Node.js)解密。我尝试在C++中做同样的事情,它的工作与预期一样:

#define DELTA 0x9e3779b9
#define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))

#define CRYPT_WORDS (64-4)/4
#define CRYPT_OFFSET 1

void btea_decrypt(uint32_t *v, int n, int base_rounds, uint32_t const key[4])
{
    uint32_t y, z, sum;
    unsigned p, rounds, e;

    /* Decoding Part */
    rounds = base_rounds + 52/n;
    sum = rounds*DELTA;
    y = v[0];

    do {
        e = (sum >> 2) & 3;
        for (p=n-1; p>0; p--) {
            z = v[p-1];
            y = v[p] -= MX;
        }

        z = v[n-1];
        y = v[0] -= MX;
        sum -= DELTA;
    } while (--rounds);
}

int main()
{
    static const uint32_t key[4] = {0x875bcc51, 0xa7637a66, 0x50960967, 0xf8536c51};
    uint32_t buf[64] = {16,  23, 163, 242, 214, 213, 125,  48, 167,  44, 232,
        23, 160, 192, 244, 116,  38, 255, 200,  38,  43,  57,
        18, 235, 206, 103, 161, 210, 187, 164,  42, 227, 139,
        248, 141, 205,  51, 132, 115, 233,  39,  53, 136, 207,
        238, 190, 111,  57, 117, 233,  67, 133, 165,  84, 154,
        161, 165, 173,  76, 115, 108,   0,   0,  71};
    uint32_t cryptpart[CRYPT_WORDS];

    // Decrypt encrypted portion
    for (int i = 0; i < CRYPT_WORDS; i++) {
        cryptpart[i] =
            ((uint32_t)buf[CRYPT_OFFSET+4*i  ]) << 0  |
            ((uint32_t)buf[CRYPT_OFFSET+4*i+1]) << 8  |
            ((uint32_t)buf[CRYPT_OFFSET+4*i+2]) << 16 |
            ((uint32_t)buf[CRYPT_OFFSET+4*i+3]) << 24;
    }

    btea_decrypt(cryptpart, CRYPT_WORDS, 1, key);

    for (int i = 0; i < CRYPT_WORDS; i++) {
        buf[CRYPT_OFFSET+4*i  ] = cryptpart[i] >> 0;
        buf[CRYPT_OFFSET+4*i+1] = cryptpart[i] >> 8;
        buf[CRYPT_OFFSET+4*i+2] = cryptpart[i] >> 16;
        buf[CRYPT_OFFSET+4*i+3] = cryptpart[i] >> 24;
    }

    for (const auto& e : buf) {
        std::cout << e << ", ";
    }
}
但是在Node.js中使用相同的代码(ported):

function btea_decrypt(v, n, base_rounds, key)
{
    let y, z, sum;
    let p, rounds, e;

    /* Decoding Part */
    rounds = base_rounds + 52/n;
    sum = rounds*0x9e3779b9;
    y = v[0];

    do {
        e = (sum >> 2) & 3;
        for (p=n-1; p>0; p--) {
            z = v[p-1];
            y = v[p] -= (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)));
        }

        z = v[n-1];
        y = v[0] -= (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)));
        sum -= 0x9e3779b9;
    } while (--rounds);
    return v;
}

function main() {
    let key = [0x875bcc51, 0xa7637a66, 0x50960967, 0xf8536c51];
    let buf = [16,  23, 163, 242, 214, 213, 125,  48, 167,  44, 232,
   23, 160, 192, 244, 116,  38, 255, 200,  38,  43,  57,
   18, 235, 206, 103, 161, 210, 187, 164,  42, 227, 139,
  248, 141, 205,  51, 132, 115, 233,  39,  53, 136, 207,
  238, 190, 111,  57, 117, 233,  67, 133, 165,  84, 154,
  161, 165, 173,  76, 115, 108,   0,   0,  71];
    let cryptpart = [];

    // Decrypt encrypted portion
    for (let i = 0; i < (64-4)/4; i++) {
    cryptpart[i] =
        (buf[1+4*i  ]) << 0  |
        (buf[1+4*i+1]) << 8  |
        (buf[1+4*i+2]) << 16 |
        (buf[1+4*i+3]) << 24;
    }

    cryptpart = btea_decrypt(cryptpart, (64-4)/4, 1, key);

    for (let i = 0; i < (64-4)/4; i++) {
        buf[1+4*i  ] = cryptpart[i] >> 0;
        buf[1+4*i+1] = cryptpart[i] >> 8;
        buf[1+4*i+2] = cryptpart[i] >> 16;
        buf[1+4*i+3] = cryptpart[i] >> 24;
    }

    console.log(buf)
}
函数btea_decrypt(v,n,base_轮,key)
{
让y,z,和;
设p,轮数,e;
/*解码部分*/
轮数=基本轮数+52/n;
总和=轮数*0x9e3779b9;
y=v[0];
做{
e=(总和>>2)和3;
对于(p=n-1;p>0;p--){
z=v[p-1];
y=v[p]-=((z>>5^y3^z5^y3^z16;
buf[1+4*i+3]=cryptpart[i]>>24;
}
控制台日志(buf)
}
它仍然卡在
do…中,而
将永远循环

我想,JavaScript和C++处理代码< 0x9E379B9</C> >不同,因为C++中的代码> 0x9E379B9* 15 < /Cord>在C++中等于39816536535和1161830871。C++中的数学错误,以及如何在JS?

中实现这一点。
如果我的英语不是最好的,很抱歉。

您的问题是由整数溢出引起的。unint32是一个固定大小为2^32位的整数。0x9e3779b9*15是39816536535,约为2^35

这意味着您会出现溢出,因为内存位置根本不足以容纳您的数字。Javascript没有这个问题,因为它不是静态类型的,并且内存中分配的大小将动态增加以容纳它

< >使用C++的较大数据类型,如<代码>未签名的长< /COD>或<代码> SiZeZt<<代码>(大多数系统中的<代码>未签名的长< /COD>),最好使用<代码> Auto <代码>,让编译器为您决定:

auto sum=rounds*0x9e3779b9;
这将解决您的问题,并确保总和足以容纳数字


<>边注释:C++中有很多C,我们在C++中尝试避免< <代码> >定义< /C> >变量,而不是在变量的顶部。当C++代码更喜欢<代码> const AutoX[/Cuff] >而不是<代码> >定义x<代码>(可能是代码> conxPRP< /COD>如果是基本类型)

C++有64位整数类型;JavaScript没有。现代JavaScript支持“大整数”键入。您正在经历的被称为整数溢出。不确定JS是否会这样做。在JS中,由于赋值中的除法,
rounds
被解释为浮点,因此可能永远不会为0-因此循环永远不会结束。请使用
Math.floor()
Math.ceil()
Math.round()
,或
Math.trunc()
四舍五入中获取整数。
function btea_decrypt(v, n, base_rounds, key)
{
    let y, z, sum;
    let p, rounds, e;

    /* Decoding Part */
    rounds = base_rounds + 52/n;
    sum = rounds*0x9e3779b9;
    y = v[0];

    do {
        e = (sum >> 2) & 3;
        for (p=n-1; p>0; p--) {
            z = v[p-1];
            y = v[p] -= (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)));
        }

        z = v[n-1];
        y = v[0] -= (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)));
        sum -= 0x9e3779b9;
    } while (--rounds);
    return v;
}

function main() {
    let key = [0x875bcc51, 0xa7637a66, 0x50960967, 0xf8536c51];
    let buf = [16,  23, 163, 242, 214, 213, 125,  48, 167,  44, 232,
   23, 160, 192, 244, 116,  38, 255, 200,  38,  43,  57,
   18, 235, 206, 103, 161, 210, 187, 164,  42, 227, 139,
  248, 141, 205,  51, 132, 115, 233,  39,  53, 136, 207,
  238, 190, 111,  57, 117, 233,  67, 133, 165,  84, 154,
  161, 165, 173,  76, 115, 108,   0,   0,  71];
    let cryptpart = [];

    // Decrypt encrypted portion
    for (let i = 0; i < (64-4)/4; i++) {
    cryptpart[i] =
        (buf[1+4*i  ]) << 0  |
        (buf[1+4*i+1]) << 8  |
        (buf[1+4*i+2]) << 16 |
        (buf[1+4*i+3]) << 24;
    }

    cryptpart = btea_decrypt(cryptpart, (64-4)/4, 1, key);

    for (let i = 0; i < (64-4)/4; i++) {
        buf[1+4*i  ] = cryptpart[i] >> 0;
        buf[1+4*i+1] = cryptpart[i] >> 8;
        buf[1+4*i+2] = cryptpart[i] >> 16;
        buf[1+4*i+3] = cryptpart[i] >> 24;
    }

    console.log(buf)
}