将Delphi代码转换为Java

Sam*_*i95 1 java delphi delphi-xe

通过将以下Delphi代码转换为Java,我遇到了问题.我在这里发布的代码只是我用来描述我的问题的完整代码的一小部分.

type
  TSecureArray = Array of AnsiChar;

const
  CodePosIdx = 10; 

function ReadLenFromArray(aArray:TSecureArray):integer;
var
  HS:integer;
begin
  Hs:=0;
  HS:=Hs+(ord(aArray[3]))*$1000000;
  HS:=Hs+(ord(aArray[4]))*$10000;
  HS:=Hs+(ord(aArray[5]))*$100;
  HS:=Hs+(ord(aArray[6]));
  result:=HS;
end;

function Decrypt(Source: Ansistring): Ansistring;    
var 
  srclen, aArrayLength: integer;
  aArray: TSecureArray;
  cryptedstring:AnsiString;
begin
  aArrayLength:=Length(Source); // length of source-String in my test case is 1046
for i:=1 to aArrayLength do                                      
    aArray[i]:=Source[i];

  srclen:=ReadLenFromArray(aArray);  // function returns 858862149 in my test case
  cryptedString:='';
  for i:=1 to srclen do
    cryptedstring:=cryptedstring+aArray[aArraylength-srclen-ord(aArray[CodePosIdx])+i];
end;
Run Code Online (Sandbox Code Playgroud)

在Java中我已经将这段Delphi代码实现为:

 protected static int readLenFromArray(char secureArray[])
    {
        int arrayLength = secureArray.length;
        int hs = 0;

        if(2<arrayLength)
        {
        hs = hs + (int) secureArray[2] * 0x1000000;
        }

        if(3<arrayLength)
        {
        hs = hs + (int) secureArray[3] * 0x10000;
        }

        if(4<arrayLength)
        {
        hs = hs + (int) secureArray[4] * 0x100;
        }

        if(5<arrayLength)
        {
        hs = hs + (int) secureArray[5];
        }

        return hs;


 }

    protected static String deCrypt(String code)
    {  
    int codePosIdx = 10;
    char [] secureArray;
    int srcLen;
    int arrayLength;

    arrayLength = source.length();   // 1046 in my test case

    for (i=0; i<arrayLength; i++)
    {
     secureArray[i] = source.charAt(i);
    }
    srcLen = readLenFromArray(secureArray); //  function returns 858862149 in my test case
    StringBuilder tmpStr = new StringBuilder();

    for(i=0; i<srcLen; i++)
    {
    tmpStr = tmpStr.append(secureArray[arrayLength - srcLen - 1 - (int) secureArray[codePosIdx - 1] + i]);
    }
    cryptCode = tmpStr.toString();

    return cryptCode;
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是在Java中检查for-Loop中的条件.在我的测试用例aArray[i + (int) secureArray[codePosIdx - 1]]aArray[-858861172],与Delphi相反,它会导致IndexOutOfBound异常.我readLineFromArray通过if语句在Java 函数中避免了它.但是我怎么能在我的decrypt函数中解决这个问题,以便为所有参数值保留函数的功能.任何真正适用的建议!

Joh*_*ica 6

问题是你声明的Delphi和Java中的数组是不一样的.
AnsiChar在Delphi中使用了一个字节.
Java始终是unicode,因此char类型是两个字节.
您需要将Java数组声明为byte aArray[].

第二个例程失败,因为Java String由两个字节组成,chars因此永远不会工作.
你需要再次传递byte aArray[]和处理它.

因为您不再使用字符串,所以不能依赖.length()函数来获取输入的长度,您必须自己进行测试以查看终止零字节的位置,或者将长度作为参数传递.