C++, эквивалентный из Java ByteBuffer?

Большинство приложений проверяет одну из следующих переменных среды (gem даже проверки оба ), так попытайтесь поместить этот код в Ваш .bashrc:

proxy=http://host.com:port/
export http_proxy=$proxy
export HTTP_PROXY=$proxy

22
задан 23 September 2009 в 15:56
поделиться

5 ответов

У вас есть stringbuf , filebuf или вы можете использовать vector .


Это простой пример using stringbuf :

std::stringbuf buf;
char data[] = {0, 1, 2, 3, 4, 5};
char tempbuf[sizeof data];

buf.sputn(data, sizeof data); // put data
buf.sgetn(tempbuf, sizeof data); // get data

Спасибо @Pete Kirkham за идею общих функций.

#include <sstream>

template <class Type>
std::stringbuf& put(std::stringbuf& buf, const Type& var)
{
    buf.sputn(reinterpret_cast<const char*>(&var), sizeof var);

    return buf;
}

template <class Type>
std::stringbuf& get(std::stringbuf& buf, Type& var)
{
    buf.sgetn(reinterpret_cast<char*>(&var), sizeof(var));

    return buf;
}

int main()
{
    std::stringbuf mybuf;
    char byte = 0;
    int var;

    put(mybuf, byte++);
    put(mybuf, byte++);
    put(mybuf, byte++);
    put(mybuf, byte++);

    get(mybuf, var);
}
15
ответ дан 29 November 2019 в 05:04
поделиться

строковый поток предоставляет базовые неформатированные операции get и write для записи блоков символов. Чтобы специализироваться на T, либо подклассифицируйте его, либо оберните его, либо предоставьте автономные функции шаблонов для использования памяти соответствующего размера для получения / записи.

template <typename T>
std::stringstream& put ( std::stringstream& str, const T& value )
{
    union coercion { T value; char   data[ sizeof ( T ) ]; };

    coercion    c;

    c.value = value;

    str.write ( c.data, sizeof ( T ) );

    return str;
}

template <typename T>
std::stringstream& get ( std::stringstream& str, T& value )
{
    union coercion { T value; char   data[ sizeof ( T ) ]; };

    coercion    c;

    c.value = value;

    str.read ( c.data, sizeof ( T ) );

    value = c.value;

    return str;
}

Вы можете написать такие шаблоны для любого другого потока или вектора, который вы хотите - в в случае вектора, вместо записи потребуется использовать вставку.

8
ответ дан 29 November 2019 в 05:04
поделиться
std::vector<char> bytes;

bytes.push_back( some_val ); // put

char x = bytes[N];           // get

const char* ptr = &bytes[0]; // pointer to array
4
ответ дан 29 November 2019 в 05:04
поделиться

Спасибо за весь ввод, это привело к довольно простому решению:


class ByteBuffer : std::stringbuf
{
public:
    template 
    size_t get( T &out)
    {
        union coercion { T value; char data[ sizeof ( T ) ]; };

        coercion c;

        size_t s= xsgetn( c.data, sizeof(T));

        out= c.value;

        return s;
    }

    template 
    size_t put( T &in)
    {   
        union coercion { T value; char data[ sizeof ( T ) ]; };

        coercion c;

        c.value= in;

        return xsputn( c.data, sizeof(T));
    }

    size_t get( uint8_t *out, size_t count)
    {
        return xsgetn((char *)out, count);
    }

    size_t put( uint8_t *out, size_t count)
    {
        return xsputn((char *)out, count);
    }
};

Для использования, например:


void ByteBufferTest( void)
{
    ByteBuffer bb;

    float f= 4;
    uint8_t u8= 1;
    uint16_t u16= 2;
    uint32_t u32= 4;
    uint64_t u64= 8;

    bb.put(f);
    bb.put(u8);
    bb.put(u16);
    bb.put(u32);
    bb.put(u64);

    uint8_t array[19];

    bb.get( array, 19);

    // or

    bb.get(f);
    bb.get(u8);
    bb.get(u16);
    bb.get(u32);
    bb.get(u64);
}
3
ответ дан 29 November 2019 в 05:04
поделиться

для std :: vector более эффективным является метод

push_back(T) 

Вы можете найти больше здесь:

http://www.cppreference.com/wiki/stl/ vector / start

и общие сведения о cpp stl libs

http://www.cppreference.com/wiki/stl/start

Есть много контейнеров, зависит от того, для чего вам это нужно,

  • скорость агрегация (возможности быстрой записи) или
  • быстрое чтение

взгляните на std :: list, std :: vector.

1
ответ дан 29 November 2019 в 05:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: