3

好的,我知道之前有人问过这个问题,但搜索后我找不到正确的答案。

我需要将缓冲区(无符号字符 *)转换为 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);
    }
}
4

4 回答 4

4

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

您如何首先获得缓冲区?无论是什么,都可能为您提供一种获取缓冲区长度的方法。

编辑

你的评论:

我有数据占用的内存大小。我尝试过使用它,但显然它不是正确的信息。

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

unsigned numelem = size / sizeof(unsigned char)

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

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

于 2009-06-23T21:09:10.220 回答
3

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

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

于 2009-06-23T21:08:32.607 回答
3
if (pBytes = (unsigned char *) GlobalLock(hMem))

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

于 2009-06-23T21:53:33.967 回答
2

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

于 2009-06-23T21:09:57.830 回答