执行查询后我运行下面的函数但不知道如何将值转换为c整数数组。
如何从pptRawValue获取整数数组,其中当我查看内存时COLUMN_VALUE_IN_BINARY_FORMAT我可以看到pptRawValue中存在该值但是无法在c代码中获取整数数组中的值?
long lColumnNum = PQfnumber(ptQueryRes, pstrColumnName);
long lFormat = PQfformat(ptQueryRes, lColumnNum);
*pptRawValue = PQgetvalue(ptQueryRes, lRowNum, lColumnNum);
*plValueLength = PQgetlength(ptQueryRes, lRowNum, lColumnNum);
int iarray[];
你可以请求文本模式输出,然后integer[]
看起来像{1,2,42}
,或者你可以请求二进制模式,但是你必须处理PostgreSQL服务器的内部数组表示。
关于integer[]
的二进制模式:
Integers themselves are represented in network byte order,所以字节顺序不应成为问题。
您必须阅读PostgreSQL源代码才能理解ArrayType
的结构。
如果客户端和服务器具有不同的体系结构,二进制更多可能是一个问题,因为对齐可能不同。
接收的二进制数组具有以下格式。我实际上已经验证了它。
这与我发现的并不完全一致,但它给了我一个起点。这是我发现的,如果我错了,希望专家会纠正我:
前20个字节似乎有关于数组的以下信息:
- 前4个字节不知道它是什么,但总是1 这可能是上面提到的Laurenz Albe的格式编号。 参考:https://www.postgresql.org/docs/current/static/protocol-overview.html#PROTOCOL-FORMAT-CODES --second 4 bytes“”“”“”“”“0 - 数组中数据类型的第三个4字节oid - 数组中第4个4字节的元素数 - 数组的第5个4字节维度
在这里形成我们的实际数据。每个数据前面都有一个4字节整数,表示下一个元素占用的字节数。知道元素的数量,可以解析内存并访问元素。
请点击链接:qazxsw poi