【问题标题】:How to cast vector<unsigned char> to char*如何将 vector<unsigned char> 转换为 char*
【发布时间】:2015-03-12 03:23:24
【问题描述】:

我有一个这样的缓冲区:

vector<unsigned char> buf

如何将其转换为 char*?

如果我这样做:

(char *)buf

我收到此错误:

/home/richard/Desktop/richard/client/src/main.cc:102: error: invalid cast from type ‘std::vector<unsigned char, std::allocator<unsigned char> >’ to type ‘char*’

对于那些想知道我为什么要这样做的人。我需要将缓冲区传递给这个函数:

n_sent = sendto(sk,(char *)buf,(int)size,0,(struct sockaddr*) &server,sizeof(server));

而且它只接受 char*。

【问题讨论】:

    标签: c++


    【解决方案1】:
    reinterpret_cast<char*> (&buf[0]);
    

    向量保证它的元素占用连续的内存。所以你寻找的“数据”实际上是第一个元素的地址(注意vector &lt;bool&gt;,这个技巧会失败)。另外,为什么你的缓冲区不是vector&lt;char&gt; 这样你就不需要reinterpret_cast?

    C++11 更新

    reinterpret_cast<char*>(buf.data());
    

    【讨论】:

    • 我正在使用 OpenCV 来获取缓冲区,并且我正在使用的函数返回向量。然后我需要将缓冲区传递给另一个只需要 char* 的函数。
    • @Richard:很公平,在这种情况下 reinterpret_cast 是合理的 :)
    • +1:我可以补充一点,reinterpret_cast 仅用于unsigned char->char 转换的目的,如果您不需要它,可以省略它。跨度>
    • @Richard:你需要知道一次,然后可以忽略,这种转换不一定适用于有符号字符的实现,它不是 2 的补码。问题在于,将 unsigned char 重新解释为 char 可能会导致与将其转换为 char 不同的值,并且您必须检查特定函数才能知道哪个是合适的。如果 char 是无符号的,或者是 2 的补码(并且实现使用了明显的转换),那么没有区别。
    • 我发现这篇文章可以让我的代码正常工作,但是当我从文件中读取缓冲区后尝试从缓冲区中读取时,我会收到“大小为 1 的无效读取”/“地址0x1000e00 未从 Valgrind 堆叠、malloc 或(最近)释放。我会想如果我做错了什么。我的 ifstream.read() 会因为内存不可用而失败。
    【解决方案2】:
    reinterpret_cast<char*>(buf.data());
    

    【讨论】:

      【解决方案3】:

      试试

      (char *)(&buf[0])
      

      或其他更多的 C++ 演员表。但也告诉我们你用这个做什么。这可能是个坏主意。

      【讨论】:

        【解决方案4】:

        您不太可能将vector&lt;unsigned char&gt; 转换为unsigned char *,但您可以获得这样的有效指针:

        vector<unsigned char> v;
        unsigned char *p = &*v.begin();
        

        那个奇怪的表达式会给你一个指针,指向由向量创建的internal分配数组的开始。如果您完全修改向量,它可能不再有效。

        看起来多余的&amp;* 的原因是* 实际上是v.begin() 返回的迭代器上的operator *。这将返回对数组第一个字符的引用,然后您可以使用&amp; 获取该字符的地址。

        【讨论】:

        • 或者,v.front()v.at(0)v[0] 将引用第一个元素,因此取消引用 v.begin() 不会在这里带来任何东西。
        • 非常正确。在我写它的时候,我有一个相当单一的想法,而其他人在我打字的时候提供了更简洁的答案,所以我只是把它留了下来,以防获取向量内部结构的性质有用。
        • 完全不可能。我现在正在使用两个 api ......一个 std/move 返回一个 char 向量,另一个使用一个 unsigned char 指针......我知道两者都应该被视为任意字节而无需转换。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-01
        • 1970-01-01
        • 2021-07-11
        • 2014-02-19
        • 2011-10-19
        • 2013-09-23
        相关资源
        最近更新 更多