我正试图为我的Xilinx Zynq SoC(ARM Cortex)创建一个查找表。
我有一个包含1330个条目的CSV文件,我无法在运行时读取或解析。我能做的最新工作是在编译时。我已经读过可以将文件嵌入到可执行文件中,以便在运行时使用它。
换句话说,我想在运行时读取和解析CSV文件,而原始文件实际上不在任何文件系统上,因为它是嵌入式设备。所以我需要以某种方式将CSV文件嵌入到可执行文件中。我将如何实现这样的目标?
CSV文件如下所示(完整文件为Hook to be called when a variable changes);
0,0,48,112,160,208,272,320,368,....,65440,65488
答案 0 :(得分:2)
您要求vector
,但我不确定您为什么一定要这样做。数据将不可避免地占用应用程序的只读(“。text”或“.rodata”或类似内容)部分中的空间,并且如果需要,您可以将其转换为vector
(这将占用堆空间)并且需要从只读.text / .rodata部分中的数据进行运行时构造和初始化,你可以将其用作POD array,因为我怀疑你将在运行时更改数据。因此,要创建数据的const
POD数组,您可以执行类似的操作....
const int myArray[] =
{
#include "myCsvFile.csv"
};
如果元素数量未修复,您的程序可以使用sizeof(myArray)/sizeof(myArray[0])
确定数字。即使它是一个固定的大小,这种技术无论如何都可能是最好的。当然,如果所有条目都是无符号的并且可以在16位内(粗略检查建议如此),而不是将其定义为int
的数组,则可以将其定义为{{1}的数组}或unsigned short
以节省空间。
我还应该提到uint16_t
关键字在这里很重要:没有它,你的数组将占用两倍的内存:首先,它将占用只读部分的空间(.text或.rodata或在应用程序初始化期间,运行时将在读/写数据部分(可能是.data)中创建只读数据的可读/写副本,其中分配了const
。为避免这种情况,请将其定义为myArray
,然后const
的地址将位于只读部分,并且不会将其复制到读/写数据部分。
答案 1 :(得分:1)
由于您的数据是无符号整数的普通数组,因此您可以使用预编译器
假设您的csv文件位于googleapis.com/oauth2/v3/tokeninfo?id_token=TOKEN
文件中。
然后只需在.cpp文件中即可:
data.csv
112
答案 2 :(得分:1)
对于您拥有的特定类型的CSV数据,例如
0,0,48,112,160,208,272,320,368,432,480,512,576,640,704,752,800,848,896,......
基本上只是一堆数字,你应该能够使用实际的#include
语句包含它们,所以;
const unsigned short myCSV[] ={
#include "./theCSV.data"
};
我正在使用unsigned short
,因为最大的数字看起来像是64k而且它可以节省一些空间 - 但是你可能想要使用int
代替,如果你相信这个数字可以大于64k < / p>