这是之前提出的问题的扩展:link。简而言之,我试图将一个C程序转换为Matlab并寻找你的建议来改进代码,因为代码没有提供正确的输出。我是否以最好的方式转换xor?
C代码:
void rc4(char *key, char *data){
://Other parts of the program
:
:
i = j = 0;
int k;
for (k=0;k<strlen(data);k++){
:
:
has[k] = data[k]^S[(S[i]+S[j]) %256];
}
int main()
{
char key[] = "Key";
char sdata[] = "Data";
rc4(key,sdata);
}
Matlab代码:
function has = rc4(key, data)
://Other parts of the program
:
:
i=0; j=0;
for k=0:length(data)-1
:
:
out(k+1) = S(mod(S(i+1)+S(j+1), 256)+1);
v(k+1)=double(data(k+1))-48;
C = bitxor(v,out);
data_show =dec2hex(C);
has = data_show;
end
答案 0 :(得分:0)
看起来你在64位双打上做了按位XOR。 [编辑:或不,似乎我忘了bitxor()
将隐式转换为整数 - 仍然,隐式转换可能并不总是按照您的预期进行,所以我的观点仍然存在,而且存储8位的效率要高得多相应类型的整数数据,而不是double
]
要复制C代码,如果key
,data
,out
和S
不是正确类型,您可以明确转换它们 - 例如key = int8(key)
- 或者如果从文件中读取它们,最好使用the precision
argument to fread()
将它们创建为正确的类型。如果这实际上已经在未显示的代码中发生,那么您只需要将转换删除为double,并让v
成为int8
。
其次,k
使用不当--Matlab数组是1索引的,因此k
需要循环1:length(data)
或(如果k
的从零开始的值}用作i
和j
,然后您需要data
索引k+1
。
(旁注:谁是x
,他来自哪里?)
第三,您似乎将v
构建为与data
大小相同的数组 - 如果这是正确的,那么您应该在循环外部使用bitxor()
和后续行。由于它们在整个数组上工作,所以每次迭代都会不必要地重复这一过程,而不是在数组已满时只执行一次。
顺便说一句,因为将C代码转换为Matlab代码有时会很棘手(并且将C代码转换为高效的 Matlab代码更加如此),如果纯粹是想要<从Matlab中使用一些现有的非平凡的C代码,然后将它包装在MEX函数中通常要容易得多。当然,如果它更多的是编程练习或探索算法的方式,那么转换它,尝试很好地矢量化等等的痛苦是值得的,我敢说,(最终)很有趣。