2012-03-30 3 views
2

Ich habe einen C++ - Prozess, der einen Thread hat, die in einem Array gespeicherten Floats zu einem anderen Prozess über Named Pipes senden müssen. Ich habe das Byte-Array zum Senden vorbereitet, aber ich bin mir nicht sicher, wie ich die Floats in eine Form bringen kann, die gesendet werden kann (d. H. Wie man sie in Bytes umwandelt). Der andere Prozess ist ein C# -Prozess auf der gleichen Maschine und ich nehme an, ich kann BitConverter verwenden, um die relevanten Bytes in der eingehenden Byte-Array und ändern Sie es in einen Float, aber ich bin nicht zu vertraut mit C++ und nicht weiß, wie man den Float in ein Byte [] umwandelt.Convert ein Float in ein Byte [], um durch eine Named Pipe (C++)

Die Plattform ist Windows, ich benutze Visual Studio 2010 C++.

+0

verwendet Ihr C++ Prozess auch das .NET Framework? –

+0

Nein, es ist nicht verwaltet. – Jkh2

+0

siehe auch http://StackOverflow.com/Questions/1906561/communication-between-c-and-c-sharp-through-pipe –

Antwort

2

Einfach genug:

const void *data = &myFloat; 
size_t size = sizeof myFloat; 

Dann memcpy verwenden, um die Daten zu verschieben, wo Sie es wollen.

+0

Wenn ich den Float in meine Byte-Array kopieren musste, werde ich sagen sagen Index 100, kann ich direkt in das Large-Byte-Array kopieren, ohne in ein Intermediate-Byte-Array der Länge 4 mit memcpy? – Jkh2

+0

ja du kannst. Geben Sie dem Memcpy eine geeignete Zieladresse. In der Tat ist es ein One-Liner: 'char * myBytes; memcpy (myBytes + 100, & myFloat, sizeof myFloat); '(' char * myBytes' anstelle von 'void *', damit ich Zeigerarithmetik verwenden kann). – Arkadiy

2

die schnelle und schmutzige Art und Weise ist es, eine Vereinigung zu nutzen:

union getBytes 
{ 
    float floatNumber; 
    byte bytes[sizeof(float)]; 
} number; 

die BIG Einschränkung ist für endianness an den beiden End-Maschinen zu beobachten. Finden Sie endianness has been solved vor vielen Zeiten, also suchen Sie nach einigen Ressourcen auf diesem. Stellen Sie nur sicher, dass Ihre Bytes auf beiden Seiten übereinstimmen.

EDIT: Bytes in Union geändert, um die Größe des Float auf der Maschine zu entsprechen.

+0

Union ist der schlechteste Weg, es zu tun. Was ist, wenn Float 8 Bytes ist? Was ist, wenn irgendwo aufgepumpt wird? – Arkadiy

+0

Union ist der richtige Weg, es zu tun. Es hat keine Probleme mit dem strikten Aliasing. Sie brauchen nur Byte 'Bytes [sizeof (float)]'. –

+0

Ich bin neugierig wie Padding ein Problem wäre, wie die Union die Elemente den gleichen Speicher belegen sollte. Die Größe von (float) Teil ist was ich vermisst habe. –