Sqlite3将数据转换成短数组

sqlite3 converting data into short array

本文关键字:数组 转换 数据 Sqlite3      更新时间:2023-10-16

我在Modbus嵌入式系统上使用sqlite3。我需要从sqlite3的选择语句结果打包的信息到一个数组的短裤,以便能够通过Modbus。

目前,我只使用2个数据类型从sqlite3 (TEXT和INT)。我试图将每个列的结果打包成一个数组。例如:

typedef struct
{
    short unitSN[4];
    short unitClass[1];
}UnitSettings;
UnitSettings unitSettings;
// prepare and execute select statement for table, then put into structs members
s = sqlite3_prepare(db, sqlstmt, strlen(sqlstmt), &stmt, &pzTest);
s = sqlite3_step( stmt );
// I want to do something like this:
unitSettings.unitSN[] = sqlite3_column_text(stmt, 0);
unitSettings.unitClass[] = sqlite3_column_int(stmt, 1);

我正在考虑创建从unsigned char* (sqlite3_column_text的结果)转换为短数组和int到短数组的函数。这是解决问题的方法吗?或者是否有合适的方法在运行中抛出这些结果?

另外,我正在考虑使结构体匹配sqlite3表类型,以便于复制,然后在结束时,有一个函数来运行每个结构体成员,并在结束时将其转换为一个数组。

EDIT:我刚刚读到结构体中的联合,我想这正是我需要的:

typedef struct
{
    union
    {
        unsigned char* unitSN;
        short unitSNArr[4]; 
    }
    union
    {
        int unitClass;
        short unitClassArr[1];
    }  
}UnitSettings;

它说现在它们都在看同一块内存,但可以以不同的方式读取它,这正是我想要的。这比任何形式的转换都简单,对吧?

sqlite不会自动为您提供这些转换。你必须自己做转换。

我将只使用纯文本访问,然后编写自由函数来转换对短文本的访问。像这样的东西,我不确定什么样的界面对你的访问最有意义。

void read_short(const char* data, size_t index, short& val) {
  val = *(reintepret_cast<short*>(&data[index*2]));
}

也许你的用例已经在短裤或其他东西的数组中使用了它们?我可能仍然只做一个短的每个字段,如果这实际上是你如何使用数据。

就我个人而言,如果你能帮助它,我会把它们作为整数输入数据库。您必须编写专门的工具来查看数据库值,这对于维护来说并不友好。