有没有办法在 MATLAB 中安全地修改 mex 文件?

Is there a way to safely modify mex files in MATLAB?

我正在使用别人的代码来达到我的目的。此代码使用从 C 代码生成的 .mex64 文件。此文件中有一个打印语句 - 它在命令 window 上显示一些内容。我需要修改此声明的文本。我可以重新编译,但我没有完整的源代码。

当我在文本编辑器中打开 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 文件正常生成 运行s - 打印文本 "Hello"。但是当我在 mex64 文件中找到单词 "Hello" 并将其修改为 "Hell" 时,它如上所述崩溃了。看起来 MATLAB 中的某种完整性检查失败了。

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

有没有办法以某种方式修改 mex64 文件并成功 运行 它?

如果更改文本长度,其他内容会在文件中四处移动,导致内部指针错误。

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

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

在编译代码中更改字符串中字节的值是完全可以的。但是只改变它们的值,不要删除或添加任何字节。

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