2010-06-23 6 views
8

Ich habe eine char* name, die eine Zeichenfolge Darstellung des Kurz möchte ich, wie "15" und müssen dies als in eine Binärdatei ausgeben. Diese Besetzung muss auch plattformübergreifend kompatibel sein.Wie konvertiert char * zu unsigned kurz in C++

Ist dies die richtige Besetzung: unitId = unsigned short(temp);

Bitte beachten Sie, dass ich bei einem Anfänger bin binär zu verstehen.

+0

Warum möchten Sie den Wert des Zeigers in einer Datei an erster Stelle speichern? Versuchen Sie, den Zeiger auf die Zeichenfolge als eine Art UID zu verwenden, die einem Primärschlüssel in einer Datenbank ähnelt? Weitere Details wären hilfreich. –

+0

Ich lese eine Binärdatei und analysiere sie, dann konvertiere ich die Daten und gebe sie in ein neues Binärformat aus. Ich arbeite auch mit Legacy-Code. Ich muss wirklich lernen, wie man char * in unsigned short umwandelt. – Elpezmuerto

Antwort

14

passen kann ich davon ausgehen, dass Ihr char* name enthält eine Zeichenfolge Darstellung der kurz, dass Sie wollen, dh "15".

Do nicht Wirf einen char* direkt auf einen Nicht-Zeiger-Typ. Umwandlungen in C ändern die Daten tatsächlich nicht (mit ein paar Ausnahmen) - sie informieren lediglich den Compiler, dass Sie einen Typ in einen anderen Typ behandeln wollen. Wenn Sie eine char* in eine unsigned short einwerfen, nehmen Sie den Wert der Zeiger (die nichts mit dem Inhalt zu tun hat), alles abschneiden, die nicht in eine short passt, und dann den Rest wegwerfen . Das ist absolut nicht das, was du willst.

Statt die std::strtoul Funktion verwenden, die einen String analysiert und gibt Ihnen wieder die gleiche Anzahl.

unsigned short number = (unsigned short) strtoul(name, NULL, 0); 

(Sie müssen noch eine Besetzung verwenden, da strtoul ein unsigned long kehrt Dieser Guss zwischen zwei verschiedenen jedoch integer-Typen, und so gültig ist. das schlimmste, was passieren kann, ist, dass die Zahl innerhalb name zu groß ist, in eine short --a Situation zu passen, die Sie an anderer Stelle überprüfen.)

+0

Nun, Sie müssen es überprüfen, _before_ Zuweisung zu "Nummer" zum Beispiel durch Zuweisung zu einem unsigned Long zuerst und überprüfen Sie gegen 'USHRT_MAX'. –

2

diese Umwandlung wird Ihnen (eine abgeschnittene) ganzzahlige Version des Zeigers geben, vorausgesetzt, dass temp auch ein Zeichen * ist. Dies ist fast sicher nicht das, was Sie wollen (und die Syntax ist auch falsch). Werfen Sie einen Blick auf die Funktion Atoi, kann es sein, was Sie brauchen, z.B. unitId = (vorzeichenlos kurz) (atoi (temp)); Beachten Sie, dass dies setzt voraus, dass (a) Temp zeigt von Ziffern in eine Zeichenfolge ist und (b) die Ziffern eine Zahl darstellen, die in einen unsigned short

9
#include <boost/lexical_cast.hpp> 

unitId = boost::lexical_cast<unsigned short>(temp); 
5

Um einen String in C++ in einen Binärcode zu konvertieren, können Sie stringstream verwenden.

#include <sstream> 

. . . 

int somefunction() 
{ 
    unsigned short num; 
    char *name = "123"; 
    std::stringstream ss(name); 

    ss >> num; 

    if (ss.fail() == false) 
    { 
     // You can write out the binary value of num. Since you mention 
     // cross platform in your question, be sure to enforce a byte order. 
    } 
} 
0

Ist die Zeigername die ID oder die Kette von Zeichen zu spitz durch name? Wenn name"1234" enthält, müssen Sie 1234 in die Datei ausgeben? Ich gehe davon aus, dass dies der Fall ist, da der andere Fall, den Sie mit unitId = unsigned short(name) machen würden, sicherlich falsch ist.

Was Sie dann wollen, ist die strtoul() Funktion.

Seien Sie vorsichtig beim Schreiben von binären Werten in eine Datei; Das Ergebnis, das offensichtliche zu tun, mag jetzt funktionieren, wird aber wahrscheinlich nicht tragbar sein.

0

Wenn Sie eine Zeichenfolge (char * in C) für eine Zahl haben, müssen Sie die entsprechende Funktion verwenden, um diese Zeichenfolge in den numerischen Wert zu konvertieren, den sie darstellt.

Dafür gibt es mehrere Funktionen. Sie sind hier dokumentiert: http://www.cplusplus.com/reference/clibrary/cstdlib