如何将内存中的位转换为一串一和零?

时间:2018-07-09 13:52:32

标签: c++

我正在尝试将大约在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中将内存中的位转换为一串一和零?

1 个答案:

答案 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。