2012-04-29 10 views
6

Voglio che listBox visualizzi gli ID memorizzati in un file. Gli ID sono in valore esadecimale.Leggi il file hex, converti in stringa e carica in listBox

Sono bloccato cercando di caricare il file e convertire l'HEX in ASCII, quindi il listBox può caricarlo. Il file contiene anche qualche informazione in più, come il nome dell'articolo, livello di articolo, e tale ...

Ecco un esempio del file:

00000000h: 50 12 00 00 2F D9 01 00 01 00 00 00 00 00 00 00 ; P.../Ù.......... 
00000010h: 46 65 61 74 68 65 72 20 45 61 72 72 69 6E 67 00 ; Feather Earring. 
00000020h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000030h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000040h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000050h: 00 00 00 00 0A 00 00 00 07 00 02 00 00 00 00 00 ; ................ 
00000060h: 00 00 00 00 00 00 00 00 00 00 00 00 B8 88 00 00 ; ............¸ˆ.. 
00000070h: 00 0C 00 00 00 00 00 00 00 00 00 00 20 00 00 00 ; ............ ... 
00000080h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000090h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000000a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000000b0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000000c0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000000d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000000e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000000f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000100h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000110h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000120h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000130h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000140h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000150h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000160h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000170h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000180h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000190h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000001a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000001b0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000001c0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000001d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000001e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000001f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000200h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000210h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000220h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000230h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000240h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000250h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000260h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000270h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000280h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000290h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000002a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000002b0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000002c0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000002d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000002e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000002f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000300h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000310h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000320h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000330h: 02 00 00 00 00 00 00 00 4A 61 64 65 20 45 61 72 ; ........Jade Ear 
00000340h: 72 69 6E 67 00 00 00 00 00 00 00 00 00 00 00 00 ; ring............ 
00000350h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000360h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000370h: 00 00 00 00 00 00 00 00 00 00 00 00 0A 00 00 00 ; ................ 
00000380h: 07 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000390h: 00 00 00 00 20 A1 07 00 00 0C 00 00 00 00 00 00 ; .... ¡.......... 
000003a0h: 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 ; .... ........... 
000003b0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000003c0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000003d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000003e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000003f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000400h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000410h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000420h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000430h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000440h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000450h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000460h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000470h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000480h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000490h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000004a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000004b0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000004c0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000004d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000004e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000004f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000500h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000510h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000520h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000530h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000540h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000550h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000560h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000570h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000580h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000590h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000005a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000005b0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000005c0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000005d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000005e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
000005f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000600h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000610h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000620h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000630h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000640h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................ 
00000650h: 00 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 ; ................ 

Ignorare il "50 12 00 00 2F D9 01 00 "all'inizio, ovvero la versione del file e altri dati irrilevanti, ciò che voglio analizzare nella listBox è l'ID dell'articolo" 01 "che è subito dopo la versione del file.

L'ID dell'articolo successivo è a "00000330h" e il valore è "02". Verso la fine dei file si può vedere che c'è ID "03" ...

EDIT:

OK, ora sto caricando il file e leggere la sezione della voce all'interno di esso, ma io non ho idea di come caricare gli ID nel listBox ... Gli ID sono separati l'uno dall'altro da 807 byte, quindi ogni 807 byte c'è un ID.

Ecco come sto caricando la sezione del file

int itemSectionStart = 0x00000000; 
    int itemSectionEnd = 0x002e11e0; 

    FileStream fstream = new FileStream("C:\\Users\\xxx\\Desktop\\xxx\\xxx\\xxx.dec", FileMode.Open); 
    BinaryReader breader = new BinaryReader(fstream); 
    long length = fstream.Length; 

    breader.BaseStream.Position = itemSectionStart; 
    byte[] itemSection = breader.ReadBytes(itemSectionEnd); 
+0

questo modo mi ricorda PC salvare i file di gioco e avendo ELITE con tonnellate di crediti :) –

+0

haha ​​sì , è qualcosa del genere: P –

+0

non capisco perché vuoi la conversione da hex a ascii?Questo hex dump è solo una presentazione visiva del file in un visualizzatore esadecimale? –

risposta

1

Finalmente raggiunto quello che stavo cercando! Ecco l'approccio che ho preso per farlo funzionare: (potrebbe non essere abbastanza, ma funziona!)

private string hex2dec(string hexString) 
{ 
    StringBuilder sb = new StringBuilder(); 
    sb.Append(long.Parse(hexString, System.Globalization.NumberStyles.HexNumber)); 
    return sb.ToString(); 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    int numRecords = 3737; 
    int itemSectionStart = 0x00000008; 
    int itemSectionEnd = 0x002e11ec; 

    using (FileStream str = File.OpenRead("C:\\Users\\xxx\\Desktop\\xxx\\xxx\\xxx.dec")) 
    { 
     BinaryReader breader = new BinaryReader(str); 
     breader.BaseStream.Position = itemSectionStart; 
     byte[] itemSection = breader.ReadBytes(itemSectionEnd); 

     int j = 0; 
     int k = j++; 
     for (int i = 0; i < numRecords; i++) 
     { 
      string id = BitConverter.ToString(itemSection, 808 * k++, 7); 
      string[] strArrayID = id.Split(new char[] { '-' }); 
      string reversedID = strArrayID[6] + strArrayID[5] + strArrayID[4] + strArrayID[3] + strArrayID[2] + strArrayID[1] + strArrayID[0]; 
      listBox1.Items.Add(this.hex2dec(reversedID)); 
     } 
    } 
} 
+0

Non sono sicuro di aver capito la tua fissazione trattandola come una stringa esadecimale. Intendi usare una stringa esagonale da qualche altra parte? Il tuo editor di testo visualizza i tuoi dati in esadecimale per tua comodità, ma i dati di identificazione sottostanti non hanno nulla a che fare con hex o ASCII. Se il tuo codice funziona, è grandioso, ma penso che tu stia facendo molto più lavoro di quello che hai davvero bisogno di fare. –

+0

se non è rotto, non aggiustarlo lol sta funzionando bene per me. –

2

Supponendo che si sa come individuare gli ID che si desidera nel file, e sapete la loro larghezza (ad esempio, si sa che sono ogni 4 byte che compongono Int32), è possibile utilizzare la classe BitConverter di C#, che accetta un array di byte e un indice e restituisce il tipo numerico corrispondente. Potrebbe essere necessario scambiare le cose se l'endianità è un problema.

Leggere il file in un array di byte, utilizzare BitConverter per ogni offset che interessa, convertire i numeri in stringhe e caricare il ListView.

int startIndex = 8; 
int recordStride = 128; 
int numRecords = 4; 

using (FileStream str = File.OpenRead("myfile.ext")) { 
    for (int i = 0; i < numRecords; i++) { 
     byte[] data = new byte[4]; 
     str.Seek(startIndex + recordStride * i, SeekOrigin.Begin); 
     str.Read(data, 0, 4); 
     if (NeedToByteSwap) 
      Array.Reverse(data); 

     int id = BitConverter.ToInt32(data, 0); 
     AddToListView(id.ToString()); 
    } 
} 

Compilare o calcolare i parametri di avvio in base alle esigenze.

+0

Grazie! Ho usato il tuo codice come base per fare ciò che volevo. –

0

Non suona così tanto come i dati sono in formato Hex - sembra più che è solo la rappresentazione che l'editor ti ha dato. Invece sembra più probabile che il file sia un dump binario diretto con testo codificato come flusso di byte ASCII.

In tal caso, si desidera isolare un intervallo di byte [] che rappresenta i caratteri (esiste una definizione chiara di ciò che delimita record, nomi ecc.). Feed che a System.Text.ASCIIEncoding (http://msdn.microsoft.com/en-us/library/system.text.asciiencoding.aspx)

Uno dei sovraccarichi GetString convertirà l'intervallo di byte in ASCII testo. (http://msdn.microsoft.com/en-us/library/744y86tc.aspx)

+0

gli ID sono 807 byte l'uno dall'altro e nel mezzo ci sono altri dati su ogni oggetto. I valori sono in HEX, ma sono "invertiti", quindi il file mostrerebbe il valore esadecimale invertito "32 DF 14 3C", che in realtà è "3C 14 DF 32" e tradurrebbe in "1008000818" in forma decimale. –