我正在尝试将大约在1999年编写的C ++ dll转换为现代C ++ dll。显然,旧程序(Lotus 123)如何将数据写入内存以及现代dll如何读取数据存在差异。我从返回值中获取垃圾(行计数的输出-20304而不是4)。该文档同时提到了C和C ++,但我不认为这很重要,因为C ++仍然可以编译C代码。
Lotus 123的文档: 获取范围内的数据,该数据被引用为指向单个单元格内容的一组指针。此方法分配用于复制范围内容的内存,设置内存中的值,然后返回可由外部C程序使用的数组指针。
示例说明:...调用 C库函数 ...
示例步骤:将下面给出的 C ++源代码(遵循脚本代码)构建到DLL中。项目中不需要其他文件。 DLL导出一个函数TransposeDoub,该函数可对双精度数组进行转置。
以下是从给出的示例代码(1999年编写)中得出的逐字记录:
' The following is the C++ source code for the transpose routine.
celld.c
#include <malloc.h>
#define DllExport __declspec( dllexport )
//
// Cell array header
//
typedef struct _CellDataHdr {
unsigned short hdrSize; // Length of this struct
unsigned short IsDouble; // 1 if the following array is double
// 0 if it is vector of char *-s
unsigned long size; // Number of elements in the array
unsigned long rows, cols, sheets; // Number of rows, columns, and sheets
// Set by GetCellData method... ignored
// Not used by other methods
} CellDataHdr, *PCellDataHdr;
// The cell array transposition follows this pattern:
//
// From ---------------->To
//
// <--cols--> <--cols-->
// ^ A B C D ^ Q R S T
// | E F G H | M N O P
// rows I J K L ==> rows I J K L
// | M N O P | E F G H
// v Q R S T v A B C D
//
//
// Transpose a cell array of doubles.
//
DllExport long TransposeDoub(unsigned long ptr, unsigned long rows, unsigned long cols)
{
PCellDataHdr hdr = (PCellDataHdr) ptr;
double *buf = (double *) &hdr[1];
unsigned int i, j;
int count = 0;
// Validate arguments and table.
if (rows <= 2 ||
!hdr->IsDouble ||
rows > hdr->rows ||
cols > hdr->cols) {
return 0;
}
for (i = 0; i < cols; i++) {
double tmp, *pCol;
pCol = &buf[i * hdr->rows]; // Calc column pointer.
// Swap column rows.
for (j = 0; j < rows/2; j++) {
tmp = pCol[rows - j - 1];
pCol[rows - j - 1] = pCol[j];
pCol[j] = tmp;
count++;
}
}
return count;
}
在上一个question中,我没有得到任何明确的帮助,因此我想尝试一些不同的方法。我想看看内存中的实际1和0,并尝试进行一些手动解释。基本上,我试图查看事物是如何编码的,以及向后工作以提取实际数据的方式。
如何在我的C ++ dll中将内存中的位转换为一串一和零?
答案 0 :(得分:1)
您可以通过执行以下操作获取特定内存位的值:
//requires bit_num < 8!
bool is_bit_set(uint8_t byte, int bit_num)
{
return (byte & (1 << bit_num)) != 0;
}
其中<<
是左移,而&
是按位与。
将双精度数组转换为uint8_t数组,然后逐字节遍历字节,根据上述函数的输出打印1或0。