gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:41:56 24 4
gpt4 key购买 nike

这是之前提出的问题的扩展:link 。简而言之,我正在尝试将 C 程序转换为 Matlab,并寻求您的建议来改进代码,因为代码没有给出正确的输出。我是否以最好的方式进行了异或转换?

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

最佳答案

看起来您正在对 64 位 double 进行按位异或。 [编辑:或者没有,似乎我忘记了 bitxor() 会隐式转换为整数 - 尽管如此,隐式转换可能并不总是符合您的预期,所以我的观点仍然存在,而且它的效率要高得多以适当的类型而不是 double 存储 8 位整数数据]

要复制 C 代码,如果 keydataoutS 尚不正确type 你可以显式地转换它们 - 例如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 函数中通常要容易得多。当然,如果它更多的是编程练习或探索算法的方式,那么转换它、尝试对其进行良好矢量化等的痛苦是值得的,而且我敢说,(最终)很有趣。

关于c - 需要有关将代码转换为 Matlab_extension 2 的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20918491/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com