2011-02-02 6 views
7

Sto lavorando con dati binari provenienti da un fornitore di servizi. Mi sto iscrivendo a questi dati tramite la richiesta HTTP, usando C++. Ogni tanto ottengo un payload HTML proveniente da questo provider. Il carico utile HTML è in realtà i dati binari, che assomiglia a quello:Utilizzo di dati binari nella stringa C++

! ¦ô¿Âˤ ÍÌL? Àÿ Àÿ¥ š™©@ Àÿ Àÿ o ! H·ô¿Âˤ ÍÌL? Àÿ333?¥ š™©@ Àÿff¦@

Vorrei fare la simulazione utilizzando i dati che ricevo. Per farlo, codifico i dati in una stringa e lancio il mio programma che userà quelle stringhe.

std::string input = "! ¦ô¿Âˤ ÍÌL? Àÿ Àÿ¥ š™©@ Àÿ Àÿ"

Il primo problema che ho è che devo scappare tutti i caratteri come \n. Ad esempio, non so come sfuggire a \0. Inoltre, ho questo messaggio di errore, che può essere dovuto al fatto che io non sfuggire il carattere di fine file in modo corretto:

Error 3 fatal error C1004: unexpected end-of-file found

Quindi la domanda principale è: ciò che fa la fine del ciclo il carattere del file sembra, e come posso evitarlo?

Quindi, c'è un comando linux o un modo per prelevare dati binari da un file binario, e sfuggire a tutti i caratteri speciali con \ quindi quindi basta copiarlo incollandolo nel mio codice C++.

Eventualmente, vorrei mettere tutti i diversi payload che ho, in un file binario, così posso avviare la mia simulazione usando questo file. Il problema è che non so come separare i diversi payload, dal momento che solo passare alla riga successiva non farà il trucco, perché verrà interpretato come un carattere casuale (e il payload non ha una dimensione fissa) . Non so che tipo di separatore usare.

risposta

14

È possibile scrivere il carico utile in un file e leggerlo utilizzando uno std::ifstream. Questo ti permetterebbe di cambiare il carico utile senza dover ricompilare.

Se davvero si vuole conservarlo come dati binari, è possibile utilizzare una vasta gamma di char, e inizializzare in quel modo:

const unsigned char raw_data[] = { 
    0x21, 0x20, 0xc2, 0xa6, 0xc3, 0xb4, 0xc2, 0xbf, 
    0xc3, 0x82, 0xc3, 0x8b, 0xc2, 0xa4, 0x20, 0xc3, 
    0x8d, 0xc3, 0x8c, 0x4c, 0x3f, 0x20, 0x20, 0xc3, 
    0x80, 0xc3, 0xbf, 0x20, 0x20, 0xc3, 0x80, 0xc3, 
    0xbf, 0xc2, 0xa5, 0x20, 0xc5, 0xa1, 0xe2, 0x84, 
    0xa2, 0xc2, 0xa9, 0x40, 0x20, 0x20, 0xc3, 0x80, 
    0xc3, 0xbf, 0x20, 0x20, 0xc3, 0x80, 0xc3, 0xbf, 
    0x60, 0x20, 0x6f, 0x72, 0x20, 0x60, 0x21, 0x20, 
    0x48, 0xc2, 0xb7, 0xc3, 0xb4, 0xc2, 0xbf, 0xc3, 
    0x82, 0xc3, 0x8b, 0xc2, 0xa4, 0x20, 0xc3, 0x8d, 
    0xc3, 0x8c, 0x4c, 0x3f, 0x20, 0x20, 0xc3, 0x80, 
    0xc3, 0xbf, 0x33, 0x33, 0x33, 0x3f, 0xc2, 0xa5, 
    0x20, 0xc5, 0xa1, 0xe2, 0x84, 0xa2, 0xc2, 0xa9, 
    0x40, 0x20, 0x20, 0xc3, 0x80, 0xc3, 0xbf, 0x66, 
    0x66, 0xc2, 0xa6, 0x40, 0x0a, 
}; 

std::string data(
    reinterpret_cast< const char* >(raw_data), 
    reinterpret_cast< const char* >(raw_data) + sizeof(raw_data)); 

Oh, a proposito, ho convertito il vostro carico utile in un buffer utilizzando il seguente semplice codice Python:

#!/usr/bin/python 

def convert_file(path, stream): 
    data = open(path, 'rb').read() 
    stream.write('const unsigned char raw_data[] = {') 
    for i, char in enumerate(data): 
     if i % 8 == 0: 
      stream.write('\n ') 
     stream.write(' 0x%02x,' % (ord(char),)) 
    stream.write('\n};\n') 

if __name__ == '__main__': 
    import sys 
    convert_file(sys.argv[1], sys.stdout) 
+0

vorrei memorizzare i carichi utili in un file, ma cuciture come devo mettere diversi carichi utili in file diversi, perché io non so cosa separatore da utilizzare. Sai anche se posso ottenere uno script o un comando per ottenere un array di caratteri dai dati binari? Grazie – Arthur

+1

+1 per la memorizzazione del codice esadecimale ... Non posso votare però. Pays di non leggere i sondaggi della comunità per questo motivo ... @jules, non puoi memorizzare la lunghezza in una forma di 'chunk', vale a dire i primi 4 byte sono la lunghezza dei dati, quindi alla fine di questo è costituito un altro Messaggio. Potresti anche incapsularli con ID. – dcousens

+0

e, naturalmente, l'utilizzo di un singolo argomento per il costruttore della stringa lo fermerebbe al primo carattere null. – Benoit