代码之家  ›  专栏  ›  技术社区  ›  bugmagnet

需要一个现实检查:我对这个VB6河豚错误的分析是正确的吗?

  •  3
  • bugmagnet  · 技术社区  · 14 年前

    最近我有理由比较河豚算法。我在比较 DI Management mcrypt . 我无法让他们以任何方式同意。

    这使我开始了一场有趣的追逐。根据 this posting

    bfinit(char *key,int keybytes)
    {
        unsigned long data;
        ...
        j=0;
        ...
            data=0;
            for(k=0;k<4;k++){
                data=(data<<8)|key[j];/* choke*/
                j+=1;
                if(j==keybytes)
                    j=0;
            }
            ...
    }
    

    键[j]的值是“1”。例如,如果键[j]=0x80,

    中的等效代码 blf_Initialise

       wData = &H0
        For k = 0 To 3
            wData = uw_ShiftLeftBy8(wData) Or aKey(j)
            j = j + 1
            If j >= nKeyBytes Then j = 0
    

    data<<=8;
    data|=(unsigned long)key[j]&0xff;
    

    我在VB6中实现了

    wData = uw_ShiftLeftBy8(wData)
    wData = wData Or ( aKey(j) And &HFF )
    

    事实上,我编写它是为了使用这两种方法,然后放入一个断言来检查值是否相同,即:

    wData = uw_ShiftLeftBy8(wData)
    wData = wData Or (aKey(j) And &HFF)
    wDCheck = uw_ShiftLeftBy8(wData) Or aKey(j)
    Debug.Assert wData = wDCheck
    

    我对这种情况的理解正确吗?是发生了符号扩展错误还是我看到了没有的错误?

    奇怪的是,DI管理代码附带的测试似乎在有或没有这种变化的情况下都能正常工作(这可能意味着我对这两种算法之间等价性的搜索可能依赖于其他一些东西)

    1 回复  |  直到 14 年前
        1
  •  2
  •   C-Mo    14 年前

    data = (data << 8) | ( ((unsigned long)key[j]) & 0xFF );
    

    但是,您发布的VB代码相当于:

    wData = (wData << 8) | (unsigned long)(aKey[j] & 0xFF);
    

    wDCheck = uw_ShiftLeftBy8(wDCheck) Or aKey(j)