2017-03-10 5 views
1

sagen, dass ich den folgenden Code in C habe ++:äquivalent von C++ Vereinigung in Python

union { 
    int32_t i; 
    uint32_t ui; 
}; 

i = SomeFunc(); 
std::string test(std::to_string(ui)); 
std::ofstream outFile(test); 

Und ich sage den Wert von i irgendwie in Python hatte, wie würde ich in der Lage sein, den Namen der Datei zu bekommen?

Für diejenigen von Ihnen, die mit C++ nicht vertraut sind. Was ich hier mache schreibe einen Wert in signed 32-Bit-Ganzzahl-Format zu i und dann interpretieren die bitweise Darstellung als unsigned 32-Bit-Integer in ui. Ich nehme die gleichen 32 Bits und interpretiere sie auf zwei verschiedene Arten.

Wie kann ich das in Python tun? Es scheint keine explizite Typspezifikation in Python zu geben, also wie kann ich einen Bitsatz anders uminterpretieren?

EDIT: Ich verwende Python 2.7.12

+0

Python ist dynamisch typisiert. Variablen haben keinen Typ, der an sie gebunden ist. In der Regel können Sie Methoden definieren, die eine bestimmte semantische Interpretation der Daten vermitteln. –

+0

@WillemVanOnsem Aber es muss eine zugrunde liegende bitweise Darstellung von Daten (mit einer bestimmten Breite) haben, oder? Also sagst du, dass Python keine 32-Bit-Ganzzahlen mit Vorzeichen hat, oder dass der Typ aus der Perspektive des interpretierten Programms unerkennbar ist? –

+0

In Python-3.x haben alle Ganzzahlen eine beliebige Größe. Sie können eine Binärzeichenfolge verwenden und diese Zeichenfolge dann so interpretieren, wie Sie es möchten. Aber afaik Python zielt darauf ab, die zugrunde liegende Repräsentation so gut wie möglich zu schützen. Zum Beispiel ist die Speicherverwaltung (meistens) undefiniert: Jeder Interpreter kann frei wählen, ob er ein Objekt auf den Stapel oder auf den Heap schieben möchte. –

Antwort

3

würde ich python struct verwenden für Bits auf unterschiedliche Weise zu interpretieren.

etwas wie -12 als unsigned integer drucken folgenden

import struct 
p = struct.pack("@i", -12) 
print("{}".format(struct.unpack("@I",p)[0])) 
+0

Das scheint bei mir zu funktionieren, vielen Dank! –