Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:如何使用Visual Studio将原始二进制数据添加到源中?_C++_Visual Studio 2008_Binary Data - Fatal编程技术网

C++ C++;:如何使用Visual Studio将原始二进制数据添加到源中?

C++ C++;:如何使用Visual Studio将原始二进制数据添加到源中?,c++,visual-studio-2008,binary-data,C++,Visual Studio 2008,Binary Data,我有一个二进制文件,我想直接嵌入到我的源代码中,因此它将被直接编译到.exe文件中,而不是从文件中读取,因此当我启动程序时,数据将已经在内存中 我该怎么做 我得到的唯一想法是将二进制数据编码到base64中,将其放入字符串变量中,然后将其解码回原始二进制数据,但这是一种棘手的方法,会导致无意义的内存分配。此外,我希望将数据存储在.exe中,与原始数据一样紧凑 编辑:我之所以想到使用base64,是因为我也想使源代码文件尽可能小。为什么使用base64?只需将文件按原样存储在一个char*中,最简

我有一个二进制文件,我想直接嵌入到我的源代码中,因此它将被直接编译到.exe文件中,而不是从文件中读取,因此当我启动程序时,数据将已经在内存中

我该怎么做

我得到的唯一想法是将二进制数据编码到base64中,将其放入字符串变量中,然后将其解码回原始二进制数据,但这是一种棘手的方法,会导致无意义的内存分配。此外,我希望将数据存储在.exe中,与原始数据一样紧凑


编辑:我之所以想到使用base64,是因为我也想使源代码文件尽可能小。

为什么使用base64?只需将文件按原样存储在一个
char*

中,最简单、最方便的方法就是编写一个小的 将数据转换为C++源程序,然后编译 并将其链接到您的程序中。此生成的文件可能会丢失 看起来像:

unsigned char rawData[] =
{
    0x12, 0x34, // ...
};

有很多这样的工具,一个典型的名字是“bin2c”。第一个搜索结果是

您需要创建一个
char
数组,最好也是
static const

在C中:

由于不能使用
char
类型的文本,而且通常C的
char
数据类型的签名取决于实现,因此可能需要一些注意

您可能希望使用以下格式:

static const unsigned char my_data[] = { (unsigned char) 0xfeu, (unsigned char) 0xabu, /* ... */ };
请注意,每个
unsigned int
literal都被强制转换为
unsigned char
,以及使其无符号的“u”后缀

因为这个问题是针对C++的,在这里<<强> CAN 有<代码> char < /C> >类型化文字,您可以考虑使用这样的格式,而不是:

static const char my_data[] = { '\xfe', '\xab', /* ... */ };
因为这只是一个字符数组,所以您也可以使用普通的字符串文字语法。嵌入零字节应该可以,只要您不尝试将其视为字符串:

static const char my_data[] = "\xfe\xdab ...";

这是最紧凑的解决方案。实际上,您也可以将其用于C。

您可以使用资源文件(.rc)。有时它们是不好的,但对于基于Windows的应用程序,这是通常的方式。

我不得不这样做,因为系统上的固件更新不支持文件操作,我们只是将原始数据复制到阵列中,如下面的回答所示。在我的源代码中,最紧凑的方式是什么?我可以通过不使用0x前缀和十进制值来优化空间,但是还有其他方法吗?我见过这样的代码:
Y\377\322\217^\377\321\227l\377\340\262\220\377
,但我不明白它是如何工作的,出于某种原因,它会导致一些编译器警告,但它仍然有效。@Rookie:nnn表示法使用八进制来指定每个字符的值\377与0xff相同。是的,但奇怪的字母在八进制数据中起什么作用?例如,有
Y
^
l
等,那里有许多奇怪的角色,我不明白其中的逻辑。@Rookie,大概不是所有的角色都是八进制转义。就个人而言,我不会太担心源代码文件的大小;如果遇到大小问题,可能是因为总表对于编译器来说太大,这将在标记化之后进行,并且不取决于输入文件的大小。我正考虑使用base64,因为我还想优化源代码中使用的空间。@Rookie,将源代码的数量增加三倍“优化”如何它?你说三倍是什么意思?base64在源代码中比使用0xff、0xff、0xff等方法更好地打包数据。请参阅下面的:orig:
这是一个测试文本
base64:
dGhpcyBpcyBhIHRlc3RpbmcgdGV4dCEh
hexstr:
74686973206973206120747657374696E67207476578742121
decarr:
116104105115,32105115,32,97,321161011115110103,321161011201116,33
@Rookie,是的,但不必转义可打印的ascii字符。您可以简单地说
char*data=“这是一个测试文本!!”这只是它占用空间的一个例子,而原始数据是肉眼可见的原始数据长度,我不能在这里粘贴二进制数据。。。再次阅读标题。只要你把这个资源放在一个单独的源文件中,我马上就发现没有理由让源大小成为问题的一部分。首先要让它易于使用,并且清楚地知道发生了什么,让编译器担心读取一些额外的字符,但我喜欢compact。因为您喜欢compact:我编写了一个工具,可以编译头文件,其中包含直接指向对象文件或静态库的资源路径列表。对于GCC:\xff等于0xff?它等于255,当使用逗号时,它的大小相同,但十进制也可以是0,0,0,0或11,11,11,11,因此在某些情况下它的大小为1到2个字节,而十六进制总是4个字节。我想我用小数,如果这些都是这里的选项的话?你能解释一下这个数据吗?在八进制值中,你可以看到
Y
^
l
,它们的逻辑是什么?避免像0这样的文字的重点是(对我来说)保持清洁;1的类型是
int
。我猜编译器通常会在初始化时进行边界检查,因此应该是安全的,但仍然有效。我不确定您在第二条注释中引用的数据来自何处,但可能是生成器决定字节值可以表示为可打印字符,并将其用于简洁。