1

我需要将此代码(在 C++ 中)转换为 Java 代码:

    short i;
    short j;
    short k;
    short result;
    unsigned short  m_table[ 256 ]

    for ( i = 0 ; i < 256 ; i++ )
    {
        k = i << 8;
        result = 0;
        for ( j = 0 ; j < 8 ; j++ )
        {
            if ( ( result^ k ) & 0x8000 )   
                result= ( result<< 1 ) ^ 0x1021;
            else
                result<<= 1;
            k <<= 1;
        }
        m_table[ i ] = (unsigned short) result;
    }

...但我从来没有得到相同的结果...

我的Java代码是:

int i;
int j;
int k;
int result;
int m_table[ 256 ] = new int[256];

for ( i = 0 ; i < 256 ; i++ ) {
    k = (i << 8);

    result = 0;

    for ( j = 0 ; j < 8 ; j++ ) {

        if ( (( result^ k ) & 0x8000) != 0)
            result= (( result<< 1 ) ^ 0x1021);
        else
            result<<= 1;

        k <<= 1;
    }

    m_table[ i ] = (result);
}
4

5 回答 5

5

在 Java 中,您需要小心使用位操作。Java 没有任何无符号类型,因此您可能需要使用比使用无符号类型更大的类型大小。

于 2009-10-13T17:47:18.823 回答
2

正如其他人所说,增加 m_table 的大小是一种解决方案。但是,您需要在铸造时小心,以保持其未签名。

简单地做:

m_table[ i ] = (int)result;

...例如,将结转结果的符号位。因此,如果签名的简短结果是 -1,那么当您真正想要的是 0xffff 时,m_table[i] 将以 -1 结束。

修复它:

m_table[ i ] = result & 0xffff;

这应该给你相当于原始的有符号短到无符号短转换......将它存储在一个 int 中只是为了保持无符号性。

于 2009-10-13T19:21:06.363 回答
1

Java 对ints 或longs (如果存在)进行整数运算,因此您需要将结果转换回short. 也没有从整数到布尔值的自动转换。省略大括号有点禁忌。所以:

        if ( ( result^ k ) & 0x8000 )   
            result= ( result<< 1 ) ^ 0x1021;
        else
            result<<= 1;

应该变成:

        if (((result^k) & 0x8000) == 0) {
            result <<= 1;
        } else {
            result = (short)((result<<1) ^ 0x1021);
        }

unsignedfrom应该去(在unsigned shortJava 中几乎没有无符号,尽管你可以使用char)。Java 的优点是具有可靠的范围和整数类型的行为。short如果您的意思是 16 位,请坚持使用。前 16 位将被删除,但在读取到& 0xffff. 原始 C(或“C++”)代码不可移植。

于 2009-10-13T19:17:15.450 回答
1

Is the JVM big-endian? What happens if you use the constants 0x0080 and 0x2110?

于 2009-10-13T17:50:39.073 回答
0

我认为您遇到的问题是左移(<<int值超出unsigned short范围。要解决此问题,您需要将左移结果屏蔽到范围内。要使用的掩码是 0xFFFF。要记住的是这&是一个非常低优先级的运算符,所以括号(很多)是有序的。这是修改后的示例。

    final int m_table[ ] = new int[256];

    for ( int i = 0 ; i < 256 ; i++ ) {
        // OK not to mask the result of << here, we are in unsigned short range
        int k = (i << 8); // BTW, terrible name for this variable

        int result = 0;

        for ( int j = 0 ; j < 8 ; j++ ) {

            if ( (( result^ k ) & 0x8000) != 0)
            {
                result= (( (result<< 1) & 0xFFFF ) ^ 0x1021);
            }
            else
            {
                result <<= 1;     // Change to 1-liner if you wish
                result &= 0xFFFF; //
            }

            k <<= 1;     // Change to 1-liner if you wish
            k &= 0xFFFF; //
        }

        m_table[ i ] = result;
    }
于 2009-10-14T14:05:41.373 回答