需要有关代码转换为Matlab_extension 2的建议

时间:2014-01-04 07:58:17

标签: c matlab

这是之前提出的问题的扩展: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

1 个答案:

答案 0 :(得分:0)

看起来你在64位双打上做了按位XOR。 [编辑:或不,似乎我忘了bitxor()将隐式转换为整数 - 仍然,隐式转换可能并不总是按照您的预期进行,所以我的观点仍然存在,而且存储8位的效率要高得多相应类型的整数数据,而不是double]

要复制C代码,如果keydataoutS不是正确类型,您可以明确转换它们 - 例如key = int8(key) - 或者如果从文件中读取它们,最好使用the precision argument to fread()将它们创建为正确的类型。如果这实际上已经在未显示的代码中发生,那么您只需要将转换删除为double,并让v成为int8

其次,k使用不当--Matlab数组是1索引的,因此k需要循环1:length(data)或(如果k的从零开始的值}用作ij,然后您需要data索引k+1

(旁注:谁是x,他来自哪里?)

第三,您似乎将v构建为与data大小相同的数组 - 如果这是正确的,那么您应该在循环外部使用bitxor()和后续行。由于它们在整个数组上工作,所以每次迭代都会不必要地重复这一过程,而不是在数组已满时只执行一次。

顺便说一句,因为将C代码转换为Matlab代码有时会很棘手(并且将C代码转换为高效的 Matlab代码更加如此),如果纯粹是想要<从Matlab中使用一些现有的非平凡的C代码,然后将它包装在MEX函数中通常要容易得多。当然,如果它更多的是编程练习或探索算法的方式,那么转换它,尝试很好地矢量化等等的痛苦是值得的,我敢说,(最终)很有趣。