我有以下代码:
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];
还有其他方法可以编写这行代码吗?
由于
答案 0 :(得分:1)
我假设keytemp数组包含长度为1的字符串,因为Apex没有Character原语。您必须将每个字符串的第一个字符转换为整数,然后执行OR。
不幸的是,Apex似乎没有内置的方法来获取单字符String的ASCII值。您可能必须编写自己的转换器功能。以下是一些人提出的解决方案存在同样的问题:
答案 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{|}~ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
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,可以进一步优化为线性搜索,但我会说它足够好了吗?