【问题标题】:How to convert unsigned char* to an unsigned char array in C/C++?如何在 C/C++ 中将 unsigned char* 转换为 unsigned char 数组?
【发布时间】:2020-10-11 15:38:22
【问题描述】:

我的函数看起来像这样:

void Example(const unsigned char* bytes)
{
    unsigned char buffer[2048] = {0};
    strcpy(buffer, bytes);
}

这不起作用。我该如何完成这项工作?

【问题讨论】:

  • 给定名称bytes,您应该有一个长度参数。 0 是一个有效字节。
  • “这不起作用。” 这怎么不起作用?你得到一个编译器错误吗?
  • 强制转换永远不会改变任何东西,它只是让编译器以不同的眼光看待事物。它可能会改变查看的方式,但不会改变事物
  • @ThomasSablik 它说““unsigned char *”类型的参数与“char *”类型的参数不兼容
  • @chris 我不太确定该怎么做,因为这个函数基本上会被 C# 从外部调用,并传递一个字节数组作为参数。我不确定如何将它转换为 C++,但我读到它必须是一个无符号字符数组。另外,我只是将长度设置为 2048,因为这样就足够了,但我觉得我在这里犯了某种错误。我通常不会用 C++ 编写代码。

标签: c++ c visual-c++ interop


【解决方案1】:

正如其他人可能提到的,strcpy 适用于 char 类型的数组,而不是 unsigned char,并且源数组必须以零结尾。

如果你不局限于C,也可以使用c++,你可以使用std::vector作为你的缓冲区。我假设 bytes 不指向以零结尾的数组,因此您需要一个额外的长度参数:

void Example(const unsigned char* bytes, size_t n)
{
   // Pointers can in c++ be used as iterators
   // 
   std::vector<unsigned char> buffer(bytes, bytes+n);
}

这让您以一种安全的方式,不受最大缓冲区大小的限制。

std::vector 中的数据是按顺序存储在内存中的,所以如果需要指向数据的指针,只需执行const unsigned char *b = &amp;buffer[0];

【讨论】:

    【解决方案2】:

    你确实需要转换任何东西。如果你想从一个复制

    void Example(const void *bytes, size_t len)
    {
        unsigned char buffer[2048];
        memcpy(buffer, bytes, len);
        /* ...*/ 
    }
    

    示例用法

    int foo(void)
    {
        char str[] = "Hello world";
        Example(str, sizeof(str));
    }
    

    【讨论】:

    • 你的意思是 char str* = "Hello world"; ?因为这只是将数组转换为数组。
    • 虽然指针和数组不是一回事,但数组在函数调用中衰减为指针,所以从技术上讲,这与 * 相同,除了指针字符串文字和数组字符串文字部分。
    • @GrünerBaum char str* = "Hello world"; 它不是有效的 C 代码。所以我肯定不是这个意思。 char *str = "Hello world"; 是的 - 在这种情况下没关系
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2012-05-06
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多