Linux в Windows C ++ байтовый массив - PullRequest
1 голос
/ 09 июня 2009

Мне нужно скопировать следующие функции Java в C ++, чтобы получить данные из Linux в Windows. Winsock2 - лучший путь?

Кроме того, какой-либо код ссылки, чтобы предложить?

ТИА, B

import java.nio.ByteBuffer;

public class MessageXdr {

    private ByteBuffer buffer;
    private int size;

    // taille max corps de message
    private static final int T_MAX_CORPS_MSG = 16384;

    public MessageXdr() {
        buffer = ByteBuffer.allocate(4 * T_MAX_CORPS_MSG);
        size =0;
    }

    public MessageXdr(byte[] array)
    {
        ByteBuffer tmpBuffer = ByteBuffer.wrap(array);
        buffer = tmpBuffer.asReadOnlyBuffer();
        size = array.length;
    }

    public int getSize()
    {
        return size;
    }

    public int getPosition()
    {
        return buffer.position();
    }

    public byte[] getArray()
    {
        return buffer.array();
    }

    public void resetBuffer()
    {
        size = 0;
        buffer.rewind();
    }

    public int readInt()
    {
        int retour = buffer.getInt();
        return retour;
    }

    public long readUnsignedInt()
    {
        ByteBuffer tmp = ByteBuffer.allocate(8);
        tmp.putInt(0);
        tmp.putInt(buffer.getInt());

        return tmp.getLong(0);
    }

    public float readFloat()
    {
        float retour = buffer.getFloat();
        return retour;
    }

    public void writeInt(int v)
    {
        buffer.putInt(v);
        size+=4;
    }

    public void writeFloat(float v)
    {
        buffer.putFloat(v);
        size+=4;
    }
}

Ответы [ 3 ]

1 голос
/ 09 июня 2009

Если вам разрешено использовать классы MFC (CSocket), он может быть ближе к коду, который вы имеете в Java.

http://msdn.microsoft.com/en-us/library/wxzt95kb(VS.80).aspx

В противном случае Winsock2 в порядке (классы MFC просто используют это в своей реализации).

1 голос
/ 10 июня 2009

Я еще не работал с ним, но когда дело доходит до упорядочения более сложных структур данных, я бы посмотрел на повышение для части сериализации.

Для фактической передачи данных winsock2 является базовым API сокета в Windows, все остальные API построены на нем (ну, не знаю о Windows 7). Но опять же, изучение boost может предоставить вам нечто независимое от платформы вам не нужно выяснять дважды. Но по моему опыту, гнезда - сложные звери, так что вам все равно придется многое выяснить ...

И избегайте CSocket от MFC, это худшая реализация за всю историю. (Даже если некоторые говорят, что они исправили некоторые ошибки, это просто не стоит того.)

0 голосов
/ 09 июня 2009

Строковые байтовые массивы не нуждаются в переводе из linux в windows или другие системы. Однако если вы имеете дело с целыми числами и числами с плавающей запятой ...

Лично я бы использовал Poco :: BinaryWriter и Poco :: BinaryReader http://pocoproject.org/docs/Poco.BinaryWriter.html

using namespace Poco;
using namespace std;
std::ofstream myFile("path", ios::in | ios::binary);
BinaryWriter writer(myFile, BIG_ENDIAN_BYTE_ORDER);
writer << 10.0f; 
writer << 10000; 
//etc etc
myFile.close();

Теперь читать

std::ifstream myFile("path", ios::in | ios::binary);
BinaryReader reader(myFile, BIG_ENDIAN_BYTE_ORDER);
int intVariable;
float floatVariable;
reader >> floatVariable;
reader >> intVariable;
//etc etc
myFile.close();
...