好的,我知道之前有人问过,但在搜索之后我找不到合适的答案。

我需要将缓冲区(unsigned char *)转换为base64,我使用的base64函数作为参数:

void Base64Enc(const unsigned char *src, int srclen, unsigned char *dest)

其中int srclensrc字符串的长度。

我的问题是,如何获得缓冲区的长度。不,它不会终止。不,我不想要sizeof(BYTE)。我只需要知道要传递给srclen的内容,以便我可以将该缓冲区转换为base64。

修改

以下是一些显示我正在做的事情的代码:

unsigned char *pBytes;
unsigned char *B64Encoded;
int b64size = 0;

if (pBytes = (unsigned char *) GlobalLock(hMem))
{
    DWORD size = (DWORD)GlobalSize(hMem);
    b64size = size / sizeof(unsigned char);
    Base64Enc(pBytes, b64size, B64Encoded);

    // in this case save the buffer to a file just for testing
    if (fp = fopen("ububub.txt", "wb"))
    {   
        printf("data: %s\n", B64Encoded);
        fwrite(B64Encoded, strlen(B64Encoded), 1, fp);
        fclose(fp);
    }
}
有帮助吗?

解决方案

如果它不是NULL终止或终止某些东西,了解大小的唯一方法是在你第一次得到它时跟踪它。

你是如何获得缓冲区的?无论如何,这可能会为您提供一种获取缓冲区长度的方法。

修改

您的评论:

  

我有内存的大小   数据需要。我试过玩那个   但这不是正确的信息   显然。

在这种情况下,请将原始大小除以每个元素的大小以获得元素数量:

unsigned numelem = size / sizeof(unsigned char)

感谢 Todd Gardner 指出 sizeof(unsigned char)是由标准定义为1,因此缓冲区中的元素数量就是缓冲区使用的空间量。

<!>“除以元素<!>的大小是任何类型元素的更通用的解决方案。

其他提示

不幸的是,这个问题确实没有通用答案。在C / C ++中,不可能简单地知道特定指针指向的元素数量。代码负责维护指针以保持这些知识。

您必须从知道指针大小的最近点开始传递此信息。

if (pBytes = (unsigned char *) GlobalLock(hMem))

在这种情况下,您有一个句柄hMem到全局内存块。必须通过调用GlobalAlloc()或GlobalReAlloc()获得此句柄。进行其中一个调用时,您必须知道内存大小。这是您要查找的字节长度。

使用c样式数组,您必须已知道大小,或者有一个终结的sentinel(如NULL)数组。运行时机器可以访问分配的内存量,但是没有一种安全,可移植的方式来访问它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top