C 无符号字符*指向的内存区域大小是多少?

C 无符号字符*指向的内存区域大小是多少?,c,base64,byte,sizeof,C,Base64,Byte,Sizeof,好的,我知道以前有人问过这个问题,但在搜索之后,我找不到正确的答案 我需要将缓冲区(unsigned char*)转换为base64,我正在使用的base64函数采用以下参数: void Base64Enc(const unsigned char *src, int srclen, unsigned char *dest) 其中int srclen是src字符串的长度 我的问题是,如何获得缓冲区的长度。不,它不是空终止的。不,我不想要(字节)的大小。我只需要知道作为srclen传递给什么,这样

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

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

void Base64Enc(const unsigned char *src, int srclen, unsigned char *dest)
其中
int srclen
src
字符串的长度

我的问题是,如何获得缓冲区的长度。不,它不是空终止的。不,我不想要(字节)的大小。我只需要知道作为
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);
    }
}

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


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

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

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

编辑 您的评论:


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

在这种情况下,取原始大小除以每个元素的大小,得到元素数:

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


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

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

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

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

最简单的方法是把指针包装在一个包含长度的结构中。@保罗,或者只使用矢量:)jReDaPar:不是在C中。不过,这是我C++推荐的第一件事。“戴维,多哈,回到评论中,我认为这是一个C++问题,数据的内存大小。我试过玩这个,但显然不是正确的信息。不,不是。您需要的是字符串的长度,源代码放入内存的信息的长度。再看看API;几乎肯定会有办法找到长度。但是sizeof(unsigned char)保证为1(C99的6.5.3.4),谢谢,我包括了这个。我只是关心一般的解决方案,这是调用:if(hMem=GlobalAlloc(GMEM_MOVEABLE,0))然后:if(CreateStreamOnHGlobal(hMem,FALSE,&pStream)==S_OK)