2011-04-10 11 views
9

HI, Jestem nowy w C# w ruchu z Java. Próbujesz odczytać plik za pomocą IO w HEX. Kiedy czytam pierwszy bajt, nie dostaję tego, co widzę w moim edytorze heksadecymalnym.Czytaj hex w C# za pomocą IO

Używam

StreamReader reader = new StreamReader(fileDirectory); 
int hexIn; 
String hex; 

for (int i = 0; (hexIn = reader.Read()) != -1; i++){ 
    hex = Convert.ToString(hexIn, 16); 
} 

w Javie użyłem ...

FileInputStream fis = new FileInputStream(file); 
    long length = file.length(); 

    int hexIn; 
    String hex = ""; 

    for(int i = 0; (hexIn = fis.read()) != -1; i++){ 

     String s = Integer.toHexString(hexIn); 
     if(s.length() < 2){ 
      s = "0" + Integer.toHexString(hexIn); 
     } 

Mam nadzieję, że to ma sens. Każda pomoc będzie najbardziej apperciated :)

Dzięki

+1

Co porównujesz do tego, czego się spodziewasz? –

+0

Witam, dostaję FFFD nie D0CF, wydaje się, że FFFD, który jest odczytywany jest ascii z D0CF, coraz zmieszany teraz ha ha – Pete

Odpowiedz

11

Nie używaj StreamReader - tylko w przypadku znaków w określonym kodowaniu (domyślne UTF8). Zamiast tego należy użyć klasy FileStream:

FileStream fs = new FileStream(fileDirectory, FileMode.Open); 
int hexIn; 
String hex; 

for (int i = 0; (hexIn = fs.ReadByte()) != -1; i++){ 
    hex = string.Format("{0:X2}", hexIn); 
} 
+0

Dziękuję Mark, czytałem wczoraj i mam to w głowie musiałem użyć czytnika strumienia, chociaż moje doświadczenie w Javie mówiło inaczej. Ale dzięki przetestowanym i działającym, każdy inny czytający to nie zapomina umieścić ... FileStream fs = new FileStream (fileDirectory, FileMode.Open); ponieważ wywołuje zamieszanie, jeśli tego nie zrobisz :) – Pete

+0

również dla uwagi, gdy inni używają tego, musisz użyć hexIn = fs.ReadByte(); powyżej, aby odczytać następny bajt, po prostu mnie pomylili minutę ha ha – Pete

+0

Naprawiłem; dzięki. –

0

Trzeba takiego kodu C# aby osiągnąć takie same wyniki jak kod Java:

hex = hexIn.ToString("X").PadLeft(2, '0'); 

Convert.ToString działa również, ale IMO przy użyciu natywnego ToString liczby całkowitej jest lepszą praktyką.
W każdym razie brakowało części PadLeft, która rzeczywiście spowodowała, że ​​15 było "f" zamiast 0F.

+0

Jak jednak czytasz w liczbie całkowitej? Zgodnie z dokumentacją metoda StreamReader.Read() zwraca wartość ASCII. Najprawdopodobniej dlatego, że nie uzyskuje takich samych rezultatów jak z edytora szesnastkowego. – JackMc

+0

@Jack każdy znak jest reprezentowany przez wartość ASCII, HEX jest po prostu inna podstawa, ale to dokładnie to samo. Postać z kodem ASCII 15 może być reprezentowana w języku HEX jako '0F' i to właśnie pokazuje redaktorzy szesnastkowi, ale za oknem jest to samo. :-) –

+0

@Shadow Wizard: Ups ... Myślałem, że próbował czytać w liczbach całkowitych :). Niestety, usunięcie odpowiedzi: P. – JackMc