有没有一种方法可以在MATLAB中安全地修改mex文件?

时间:2018-07-06 11:43:26

标签: matlab mex

我出于目的使用了他人的代码。此代码使用从.mex64代码生成的C文件。该文件中有一条打印语句-它在命令窗口上显示一些内容。我需要修改此语句的文本。我可以重新编译,但是我没有完整的源代码。

当我在文本编辑器中打开mex64文件时,可以看到要以纯文本打印的文本。但是,如果我尝试修改并运行它,则matlab会因系统错误而崩溃-

Abnormal termination:
Access violation

这是我尝试重现此问题的方法。我写了以下代码-

#include <stdio.h>
#include "C:\Program Files\MATLAB\R2017b\extern\include\mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
  main();
  return;
}

int main(){
    printf("Hello\n");
}

生成的mex64文件正常运行-打印文本“ Hello”。但是,当我在mex64文件中找到单词“ Hello”并将其修改为“ Hell”时,它如上所述崩溃了。看起来MATLAB中存在某种完整性检查失败了。

有人可以解释发生了什么事吗?

是否可以通过某种方式修改mex64文件并成功运行它?

1 个答案:

答案 0 :(得分:3)

如果更改文本长度,则其他内容会在文件中四处移动,从而使内部指针出错。

但这可能不是唯一发生的事情。您的文本编辑器可能还会更改很多其他字节的值(例如,文本中0-31范围内的值是无意义的,通常文本编辑器会忽略它们或更改它们)。

您应该在二进制文件编辑器中执行此操作,这些文件通常称为hex editor

在已编译的代码中更改字符串中字节的值非常好。但只能更改其值,请勿删除或添加任何字节。

您会注意到所有字符串都以0字节结尾。那是字符串结尾标记。不要覆盖它。但是,您可以(通常)提前添加一个以使字符串更短。也就是说,您在字符串的末尾添加了一个零字节,并且不删除其后的任何字节。