0

次のコードがあります。

public class Testcode {



private static final Long[] P = new Long[18];             

public void setKey( string key )    

{    

integer i, j, k;    

long data;    

integer N = 16;    

string[] keytemp = new string[]{}; keytemp.add(key);



// Initialize P and S.    

for ( i = 0; i < N + 2; ++i ){        

P[i] = Pinit[i];        

}              

// XOR the key into P.    

j = 0;    

for ( i = 0; i < N + 2; ++i )        

{        

data = 0;        

for ( k = 0; k < 4; ++k )        

{       

data = ( data << 8 ) | keytemp[j];        

++j;        

}        

P[i] ^= data;        

}              

}   



private static final long[] Pinit = new Long[] {       

604135516L,   2242044355L,  320440478L ,  57401183L,        

2732047618L,  698298832L,   137296536L ,  3964563569L,        

1163258022L,  954160567L,   3193502383L,  887688400L,        

3234508543L,  3380367581L,  1065660069L,  3041631479L,        

2420952273L,  2306437331L       

};      

}

次のエラーが表示されます:

エラー: コンパイル エラー: OR 演算子は、ブール式、または行 36 列 18 の整数式または長式式にのみ適用できます

これは次の行にあります:

   data = ( data << 8 ) | keytemp[j];

このコード行を記述する別の方法はありますか?

ありがとう

4

2 に答える 2

1

そんな感じ?

配列の最初のプライミングを除いてループはありません...そして後で各文字を個別に取得する必要がありますが、アルゴリズムには1文字の長い文字列が必要なようですか?

List<Integer> ints = new List<Integer>();
for(Integer i =0; i < 256; ++i){
    ints.add(i);
}
String allAscii = String.fromCharArray(ints);

// System.debug(allAscii);  // funny result if you really want to start from 0x00 character
System.debug(allAscii.substring(1));    // for demo purposes we'll show only from 0x01 though

String text = 'Hi StackOverflow.com!';
for(Integer i =0; i < text.length(); ++i){
    String oneChar = text.mid(i, 1);
    System.debug(oneChar + ' => ' + allAscii.indexOf(oneChar));
}

出力:

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{&#124;}~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ

H => 72
i => 105
  => 32
S => 83
t => 116
a => 97
c => 99
k => 107
O => 79
v => 118
e => 101
r => 114
f => 102
l => 108
o => 111
w => 119
. => 46
c => 99
o => 111
m => 109
! => 33

私には良さそうです(スペースは#32などです)。

indexOf の代わりにa を構築すれば、線形検索にさらに最適化できますがMap<String, Integer>、それで十分だと思いますか?

于 2013-05-31T22:30:45.940 に答える
1

Apex には Character プリミティブがないため、keytemp 配列には長さ 1 の文字列が含まれていると想定しています。各文字列の最初の文字を整数に変換してから、OR を実行する必要があります。

残念ながら、Apex には、単一文字の文字列の ASCII 値を取得する組み込みの方法がないようです。独自のコンバーター関数を作成する必要がある場合があります。いくつかの提案された解決策で同じ問題を抱えている人を次に示します。

文字列を ASCII 値に変換する方法の議論

于 2013-05-31T20:47:52.573 に答える