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
    

    charint 之间的运算结果是 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”的代码非常相似,所以我希望我坚持的这一点是相同的。谢谢你的帮助,你给了我一些很好的建议,明天我会在工作中尝试。 更具体地说 - 位运算符 &amp; 在 C++ 中定义为 T T::operator&amp;(const T2 &amp;b) const;

以上是关于C ++到Java按位等效[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Java到C交叉编译[关闭]

从 Java/C# 到 C++ 的最佳方式是啥? [关闭]

C ++模板到Java泛型[关闭]

Perl 的 require 命令的 java 等效项是啥? [关闭]

需要的建议:有效的 Java 到 C 源代码转换器 [关闭]

将 Java GUI 添加到 C 客户端 [关闭]