Java C ++代码转换

时间:2009-10-13 17:42:37

标签: java c++ porting

我需要将此代码(在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);
}

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

正如其他人所说,增加m_table的大小是一个解决方案。但是,您需要在投射中小心保持未签名。

简单地做:

m_table[ i ] = (int)result;

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

通过以下方式解决此问题:

m_table[ i ] = result & 0xffff;

那应该给你相当于原始签名的短签给无符号的短演员......把它存放在一个int里只是为了保持无符号的。

答案 2 :(得分:1)

JVM是big-endian吗?如果使用常量0x0080和0x2110会发生什么?

答案 3 :(得分:1)

Java在intlong s(如果存在)上执行整数运算,因此您需要将结果返回到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);
        }

来自unsigned的{​​{1}}应该去(在Java中几乎没有签名,尽管你可以使用unsigned short)。 Java具有可靠范围和整数类型行为的优点。如果你的意思是16位,请坚持使用char。前16位将被删除,但在读出short时要小心。原始的C(或“C ++”)代码不可移植。

答案 4 :(得分:0)

我认为您遇到的问题是int范围之外的左移(&lt;&lt; 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;
    }