2016-06-02 18 views
1

Ich versuche, ISO8583 Nachricht Bitmap auf schnelle Weise zu decodieren. Angenommen, das erste Bitmap-Zeichen ist ein "B", möchte ich es in den Hexadezimalwert 0xB (dezimal 11) konvertieren, um danach zu überprüfen, welche Bits markiert sind. Der letzte Teil mache ich auf diese Weise:Transform 'B' in 0xB

for(int i = 0; i < 4; i++){ 
    std::cout << (value &(1 << i)); 
} 

Da Bitmaps und Nachrichten lang sind, versuche ich schnell zu dekodieren. Ich habe einige SO-Posts mit std :: hex und std :: stringstream gesehen. Aber mit diesen oder Nachschlagetabellen ist es nicht zu viel?

+0

@ FrédéricHamidi somthing wie: int val = (byte> = ' EIN') ? (Byte - 55): (Byte - '0')? Auch mit ternären Operator ist schnell? – learner

Antwort

2

Was will ich von ‚B‘ konvertieren Hex-Wert 0xB, die 11

Also, Sie B als Hexadezimalzahl und bekommen Zahlenwert, sondern als "sie interpretieren wollen konvertieren hexadezimale Darstellung ". Folgende Arbeiten für jede Base (bis zur Basis 36) und mit Groß- und Kleinbuchstaben Ziffern:

int value = 
    (c >= '0' && c <= '9') ? (c - '0')  : 
    (c >= 'A' && c <= 'Z') ? (c - 'A' + 0xA) : 
    (c >= 'a' && c <= 'z') ? (c - 'a' + 0xA) : 
    -1; // error 

Sie ersetzen können z mit f, wenn Sie den Fehlerwert wollen, wenn die Eingabe nicht eine hexadezimale Ziffer ist.


Alte Antwort:

Zeichen werden als Zahlen codiert. Welcher numerische Wert repräsentiert, welches Zeichen durch die Zeichencodierung bestimmt wird.

"Hexadezimale Darstellung" einer Zahl ist eine Zeichenkette. Diese Zeichen repräsentieren die Hexadezimalziffern der Zahl einzeln. Die numerischen Werte der Zeichen in der hexadezimalen Darstellung sind ohne den Kontext der Zeichencodierung bedeutungslos.

das erste Bitmap char Gesetzt ist ein ‚B‘, will ich es hexadezimale Darstellung umzuwandeln (Transform ‚B‘ in 0xB)

#include <string> 
using namespace std::string_literals; 

int main() { 
    char c = 'B'; 
    std::string hex = "0x"s + c; // now hex is "0xB" 
} 

Es wäre in der Tat ziemlich ineffizient sein, zuerst Konvertieren Sie B in eine Ganzzahl und dann zurück in Hexadezimaldarstellung mit std::stringstream, wenn alles, was Sie möchten, ist, das Präfix hinzuzufügen.

+0

Ich glaube, ich war nicht klar genug. Was ich will, ist von "B" zu Hexadezimalwert 0xB, was 11 ist. Und danach überprüfen, welche Bits markiert sind. In diesem Fall 1011. – learner

+0

@learner ah, also wollen Sie "B" als hexadezimale Ziffer interpretieren und numerischen Wert erhalten, anstatt "* in hexadezimale Darstellung umwandeln *"? Es scheint, dass R Sahu deine Gedanken gelesen hat und diese bereits beantwortet hat. – user2079303

+0

@learner Ich habe meine eigene Version hinzugefügt, die mit jeder Basis bis 36 und mit Groß- und Kleinbuchstaben funktioniert. – user2079303

1

Erstellen Sie ein Array, das als Karte fungiert.

int hexNumbers[] = { 0xA, 0xB, 0xC, 0xD, 0xE, 0xF }; 

und dann verwenden, um wie folgt:

if (c >= 'A' && c <= 'F') 
{ 
    number = hexNumbers[c-'A']; 
} 
else if (c >= 'a' && c <= 'f') 
{ 
    number = hexNumbers[c-'a']; 
} 

Sie es ohne Karte auch tun können:

if (c >= 'A' && c <= 'F') 
{ 
    number = 0xA + (c-'A'); 
} 
else if (c >= 'a' && c <= 'f') 
{ 
    number = 0xA + (c-'a'); 
} 
+0

So etwas zu tun ist nicht schneller: (byte> = 'A')? (Byte - 55): (Byte - '0'); ? Ich mache mir Sorgen, denn danach nehme ich jeden Wert und überprüfe, welche Bits markiert sind. – learner

+0

@learner, Sie erhalten die Grundidee. Wenn Sie sich Sorgen um die Leistung machen, vergleichen Sie den Code mit einigen großen Datensätzen und passen Sie Ihren Code entsprechend an. In solchen Fällen ist die IO eher ein Flaschenhals als die 'if-else'-Prüfungen. –

+0

Rechts. Jetzt geht es mir um Bit-Checking. – learner