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