C ++到Java按位等效[关闭]
Posted
技术标签:
【中文标题】C ++到Java按位等效[关闭]【英文标题】:C++ to Java Bitwise equivalent [closed] 【发布时间】:2016-10-06 16:07:13 【问题描述】:我正在尝试将 C/C++ 类转换为 Java 等价物。到目前为止一切正常,但我已经编写了这段代码,Java 正在抱怨。
// Isolate each byte in turn
cRecByte = lpszRec[ lRecByteCount++ ] & 0x00FF;
cRecByte 是一个char
lpszRec 是LPCSTR
lRecByteCount 是一个long
这适用于 C++ 代码,但不适用于 Java。
在我的 Java 代码中,我有完全相同的行,但有以下区别
cRecByte 是一个char
lpszRec 是一个String
lRecByteCount 是一个long
我得到的错误(如我所料)是
Type mismatch: cannot convert from int to char
Type mismatch: cannot convert from long to int
在某些情况下,我正在尝试重写/模拟 1980 年代编写的 Hash Totaling 函数,该函数至今仍被我们的遗留系统使用。用新的东西替换它们会花费大量的开发/测试成本,所以我必须继续沿着这条路走下去。
我提供的这段代码旨在将每个字符从给定记录(文本行)中分离出来。
任何帮助将不胜感激。
请求的一些代码 - 这是来自 C++ 文件。我只去了我必须去的地方,因为实际的班级很大。
void CHashTotalFile::CalcRecHashTotal( /*[in]*/ LPCSTR lpszRec,
/*[in]*/ DWORD dwRecLen,
/*[in]*/ long lIteration,
/*[in,out]*/ UINT64& u64HashTotal,
SYSTYPE stType ) throw()
char cRecByte;
LPCSTR szNullReplacer = "CALCULATE HASH TOTAL";
const static int nLenNullReplacer = lstrlenA( szNullReplacer );
const static char szRandomMap[] = 17,
5,
37,
31,
53,
19,
41,
7,
11,
2,
23,
3,
29,
47,
43,
13 ;
// 64bit unsigned integer data types:
UINT64 u64ByteValue;
UINT64 u64Carry;
// long data types:
long lByteWord; // Used in u64ByteValue & offset to random map
long lRecByteCount; // Byte count within (actual) record - used as subscript to data
long lRecByteIndex; // Byte count within (logical) record - used in hashing calculations
// int data types:
int nAttempts;
int nByteDistance; // 'random' distance which rotates (right) the hash total
int nHashDistance; // 'random distance which rotates (left) the hash total
int nWordValue; // From data - offset to random map for hash distance
bool bGenerated = false;
// No exception calls or error logging here as efficiency is the name of the game!
// (or not so much inefficiency!)
// If text & this is a blank line (i.e. \n) set to record length to zero
if( m_fText && lpszRec[0] == NEWLINE_CHARACTER )
dwRecLen = 0;
// use dummy string where no data
if( dwRecLen == 0 )
lpszRec = szNullReplacer;
dwRecLen = nLenNullReplacer;
for( nAttempts = 0; (nAttempts <= MAX_HASH_ATTEMPTS) && !bGenerated; nAttempts++ )
// Loop around every byte in the record
for( lRecByteCount = lRecByteIndex = 0L; lRecByteCount < dwRecLen; lRecByteIndex++ )
// Isolate each byte in turn
cRecByte = lpszRec[ lRecByteCount++ ] & 0x00FF;
if( m_fText ) // If text
【问题讨论】:
你能发一个minimal reproducible example 这样我们就不用从你的线索中拼凑起来了吗? 尝试从long
投射到int
?
lpszRec[...]
不适用于字符串,请尝试使用lpszRec.charAt(...)
或lpszRec.toCharArray()[...]
代替(并使用int
索引ofc)。更好的是你可能想使用lpszRec.getBytes("whatever encoding you need")[...]
。
@Thomas - lpszRec.getBytes() 是否意味着我不需要导致问题的位?
@thonnor 你会得到多少字节取决于编码,但你不必隔离它们,所以它可能解决你的问题。
【参考方案1】:
我在这里看到多个单独的问题:
数组索引总是 int
long l = 0;
int[] i = new int[] 1, 2, 3 ;
int res1 = i[l]; //Error: Type mismatch: cannot convert from long to int
int res2 = i[(int)l]; //works
字符串不能作为数组直接访问 - 您需要先将其转换为数组或使用访问器:
String testString = "TESTSTRING";
char c1 = testString[0]; //Error: The type of the expression must be an array type but it resolved to String
char c2 = testString.charAt(0); //works
char
和 int
之间的运算结果是 int
- 如果要将其存储为 char
,则需要显式转换:
char c = 'h';
char var1 = c & 0x00FF; //Error: Type mismatch: cannot convert from int to char
char var2 = (char) (c & 0x00FF); //works
【讨论】:
谢谢。好答案。为什么 No 3 中的错误会在 C 中起作用?这是我的困惑。我不知道将 &0x00FF 放在一起会产生什么后果。 因为 C++ 是一种不同的语言,有着不同的规则。 是的,我明白了。但是因为我“移植到 Java”的代码非常相似,所以我希望我坚持的这一点是相同的。谢谢你的帮助,你给了我一些很好的建议,明天我会在工作中尝试。 更具体地说 - 位运算符&
在 C++ 中定义为 T T::operator&(const T2 &b) const;
。以上是关于C ++到Java按位等效[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Perl 的 require 命令的 java 等效项是啥? [关闭]