Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

You will need the length of the buffer. Once you do, we can do this:

unsigned char *charBuf = (unsigned char*)voidBuf;
/* create a vector by copying out the contents of charBuf */
std::vector<unsigned char> v(charBuf, charBuf + len);

Okay, the comment got me started on why I did not use reinterpret_cast:

  • In C++, the C-style cast is a convenience function -- it asks the compiler to choose the safest and most portable form of conversion over the set of available cast operators.

  • The reinterpret_cast is implementation defined and should always be the last thing on your mind (and used when you are necessarily doing a non-portable thing knowingly).

  • The conversion between (unsigned doesn't change the type) char * and void * is portable (you could actually use static_cast if you are really picky).

    The problem with the C-style cast is: the added flexibility can cause heartaches when the pointer type changes.

    Note: I agree with the general convention of not casting as much as possible. However, without any source provided, this is the best I could do.

    @dirkgently: +1, but please indicate that this creates a copy of the buffer -- that's important, but not obvious from your post. – j_random_hacker Apr 7, 2009 at 11:02 @j_random_hacker: OP mentioned 'passing' -- I assumed he meant a copy. Anyway, updated source with comments. – dirkgently Apr 7, 2009 at 11:06 yeah if anything, why not static_cast<>. it's not impl defined, it's portable. it's just not convenient. but it's much safer :) anyway, you've provided rationale why you did use c-style cast. like it, so +1 :D – Johannes Schaub - litb Apr 7, 2009 at 11:12

    You can't simply cast a void* to a std::vector<unsigned char> because the memory layout of the latter includes other objects, such as the size and the number of bytes currently allocated.

    Assuming the buffer is pointed to by buf and its length is n:

    vector<unsigned char> vuc(static_cast<char*>(buf), static_cast<char*>(buf) + n);
    

    will create a copy of the buffer that you can safely use.

    [EDIT: Added static_cast<char*>, which is needed for pointer arithmetic.]

    The only time this would be legitimate is if you had already created a vector, and simply wanted to get it back.

    void SomeFunc(void* input);
    main() {
      std::vector< unsigned char > v;
      SomeFunc((void*) &v);
    SomeFunc(void* input) {
      // Now, you could cast that void* into a vector
      std::vector< unsigned char >* v_ = (vector<unsigned char>*)input
    

    I haven't actually tried to see if this will run, but that's the spirit of it. That said, if you are making this from scratch, you are definitely doing it wrong. This is really bad. The only time this could be even remotely understandable is if you are forced to implement the already defined "SomeFunc()".

    using std::vector class for an already allocated buffer is not a solution. A std::vector object manages the memory and deallocates it at destruction time.

    A complicated solution might be to write your own allocator, that uses an already allocated buffer, but you have to be very careful on several scenarios, like vector resizing, etc.

    If you have that void* buffer bound through some C API functions, then you can forget about conversion to std::vector.

    If you need only a copy of that buffer, it can be done like this:

    std::vector< unsigned char> cpy( 
        (unsigned char*)buffer, (unsigned char*)buffer + bufferSize);
    

    where bufferSize is the size in chars of the copied buffer.

    Thanks for contributing an answer to Stack Overflow!

    • Please be sure to answer the question. Provide details and share your research!

    But avoid

    • Asking for help, clarification, or responding to other answers.
    • Making statements based on opinion; back them up with references or personal experience.

    To learn more, see our tips on writing great answers.

  •