OR运算符只能应用于布尔表达式或Integer或Long表达式?

时间:2013-05-31 20:24:59

标签: apex-code visualforce

我有以下代码:

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行的Integer或Long表达式

就在这一行:

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

还有其他方法可以编写这行代码吗?

由于

2 个答案:

答案 0 :(得分:1)

我假设keytemp数组包含长度为1的字符串,因为Apex没有Character原语。您必须将每个字符串的第一个字符转换为整数,然后执行OR。

不幸的是,Apex似乎没有内置的方法来获取单字符String的ASCII值。您可能必须编写自己的转换器功能。以下是一些人提出的解决方案存在同样的问题:

Discussion of how to convert strings to ASCII values

答案 1 :(得分: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等)。

如果您构建Map<String, Integer>而不是indexOf,可以进一步优化为线性搜索,但我会说它足够好了吗?