linux til windows C + + byte array

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skal replikere følgende Java-funktionalitet i C ++ for at hente data fra Linux til Windows. Er Winsock2 den bedste vej til at gå ?.


Også nogen henvisningskode til at foreslå?


TIA,
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;
    }
}

Bedste reference


Hvis du har lov til at bruge MFC-klasserne (CSocket), kan den være tættere på den kode, du har i Java.


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


Ellers er Winsock2 fint (MFC-klasserne bruger bare det i deres implementering).

Andre referencer 1


Jeg har ikke arbejdet med det endnu, men når det kommer til at samle mere komplekse datastrukturer, ville jeg se på boost for serialiseringsdelen.


For den faktiske dataoverførsel er winsock2 det grundlæggende stik api i windows, alle andre api er bygget på det (det ved jeg ikke om Windows 7). Men igen, at se på boost kunne give dig noget platform uafhængigt skal ikke finde ud af to gange. Men fra min erfaring er stikkontakter komplekse dyr, så du bliver nødt til at finde ud af en masse alligevel ...


Og undgå CSocket fra MFC, det er den værste implementering nogensinde. (Selvom nogle siger at de har rettet nogle af sine fejlbehov, er det bare ikke det værd.)

Andre referencer 2


Streng byte arrays behøver ikke nogen oversættelse fra linux til windows eller andre systemer. Hvis du beskæftiger dig med heltal og flyder dog ...


Personligt ville jeg bruge Poco :: BinaryWriter og Poco :: BinaryReader
http://pocoproject.org/docs/Poco.BinaryWriter.html[5]


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();


Nu for at læse


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();