好的,我知道之前有人问过,但在搜索之后我找不到合适的答案。
我需要将缓冲区(unsigned char *)转换为base64,我使用的base64函数作为参数:
void Base64Enc(const unsigned char *src, int srclen, unsigned char *dest)
其中int srclen
是src
字符串的长度。
我的问题是,如何获得缓冲区的长度。不,它不会终止。不,我不想要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);
}
}
答案 0 :(得分:4)
如果它不是NULL终止或终止某些东西,了解大小的唯一方法是在你第一次得到它时跟踪它。
你是如何获得缓冲区的?无论如何,这可能会为您提供一种获取缓冲区长度的方法。
您的评论:
我有内存的大小 数据需要。我试过玩那个 但这不是正确的信息 显然。
在这种情况下,请将原始大小除以每个元素的大小以获得元素数量:
unsigned numelem = size / sizeof(unsigned char)
感谢Todd Gardner指出 sizeof(unsigned char)由标准定义为1,因此缓冲区中的元素数量就是你的空间量缓冲区使用。
“按元素大小划分”是对任何类型元素的更通用的解决方案。
答案 1 :(得分:3)
不幸的是,这个问题确实没有通用答案。在C / C ++中,不可能简单地知道特定指针指向的元素数量。代码负责维护指针以保持这些知识。
您必须从知道指针大小的最近点开始传递此信息。
答案 2 :(得分:3)
if (pBytes = (unsigned char *) GlobalLock(hMem))
在这种情况下,您有一个句柄hMem到全局内存块。必须通过调用GlobalAlloc()或GlobalReAlloc()获得此句柄。进行其中一个调用时,您必须知道内存大小。这是您要查找的字节长度。
答案 3 :(得分:2)
使用c样式数组,您必须已知道大小,或者有一个终结的sentinel(如NULL)数组。运行时机器可以访问分配的内存量,但是没有一种安全,可移植的方式来访问它。