【问题标题】:What is the size of the memory area pointed to by an unsigned char *?unsigned char * 指向的内存区域的大小是多少?
【发布时间】:2009-06-23 21:05:07
【问题描述】:

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

我需要将一个缓冲区(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);
    }
}

【问题讨论】:

    标签: c base64 byte sizeof


    【解决方案1】:

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

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

    编辑

    您的评论:

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

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

    unsigned numelem = size / sizeof(unsigned char)
    

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

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

    【讨论】:

    • 我有数据占用的内存大小。我尝试过使用它,但显然它不是正确的信息。
    • 不,不是。您需要的是字符串的长度,即您的源放入内存的信息的长度。再看API;几乎肯定会有办法找到长度。
    • 但 sizeof(unsigned char) 保证为 1(C99 的 6.5.3.4)
    • 谢谢,我把它包括在内。我只关心通用解决方案。
    【解决方案2】:

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

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

    【讨论】:

    • 跟踪此信息的最简单方法是将指针包装在一个也包含长度的结构中。
    • @Paul,或者只使用矢量 :)
    • @JaredPar:不在 C 语言中。不过,这是我推荐用于 C++ 的第一件事。
    • @David,doh,回到 cmets,我认为这是一个 C++ 问题
    【解决方案3】:
    if (pBytes = (unsigned char *) GlobalLock(hMem))
    

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

    【讨论】:

    • 这是调用:if (hMem = GlobalAlloc(GMEM_MOVEABLE, 0)) 然后:if (CreateStreamOnHGlobal(hMem, FALSE, &pStream) == S_OK)
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2021-09-22
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      • 2011-10-08
      相关资源
      最近更新 更多