Little Endian 16 bit Intiger

0

Muszę odczytać plik który posiada nagłówek oraz dane zapisane w postaci Little Endian 16 bit Intigers.

Próbowałem już ze wszystkich stron atakować ten temat i null :/ próbowałem tak :

  DataInputStream dis = null;
        String record;
        int recCount = 0;
        try {

            File f = new File("mmm.rec");
            FileInputStream fis = new FileInputStream(f);
            BufferedInputStream bis = new BufferedInputStream(fis);
            dis = new DataInputStream(bis);

            while ((record = dis.readLine()) != null) {
                recCount++;
              System.out.println(recCount + ": " + record);
//              System.out.println(f.length());
            }

        } catch (IOException e) {
// catch io errors from FileInputStream or readLine()
            System.out.println("Uh oh, got an IOException error!" + e.getMessage());

        } finally {
// if the file opened okay, make sure we close it
            if (dis != null) {
                try {
                    dis.close();
                } catch (IOException ioe) {
                }
            }
        }
i nic (odczytuje tylko nagłowek :/ )

i tak  

    FileChannel fc = new FileInputStream("mmm.rec").getChannel();
    ByteBuffer bb = ByteBuffer.allocate(BSIZE).order(ByteOrder.LITTLE_ENDIAN);
    fc.read(bb);
    bb.flip();
    float licz = 0;
    while(bb.hasRemaining()){
    System.out.println(licz + ":" + bb.allocate);
    }


    } catch (EOFException e) {
    System.err.println("end");
    }

to samo 
i tak : 

File file = new File("mmm.rec");
FileInputStream fis = null;
BufferedInputStream bis = null;
DataInputStream dis = null;
try {
fis = new FileInputStream(file);
String[] linia;
// Here BufferedInputStream is added for fast reading.
bis = new BufferedInputStream(fis);
dis = new DataInputStream(bis);
// dis.available() returns 0 if the file does not have more lines.
while (dis.available() != 0) {
// this statement reads the line from the file and print it to
// the console.
System.out.println(dis.readLine());
}

// dispose all the resources after using them.
fis.close();
bis.close();
dis.close();

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

i ciągle mi wyskakują jakieś szlaczki :/

Może ja coś pomojam ?

Jeżeli ktoś by mógł mnie naprowadzić na temat...

0

A co jest w tym pliku?

0

jest to plik formatu edf http://www.edfplus.info/ jest to 24 godzinne badanie eeg :)

0

Na pewno nie da się tego zrobić readLine bo to nie są ciągi UTF-8. Musisz wczytać dane jako tablicę bajtów, potem utworzyć z nich stringa konstruktorem: http://download.java.net/jdk7/docs/api/java/lang/String.html#String(byte[], java.nio.charset.Charset) i zrobić trim() aby usunąć spacje z końca.

Te integery w edf są w little endian??? Dziwne by to było. DataInputStream odczytuje w big endian czyli "normalnej" kolejności bajtów.

0

No właśnie ja już próbowałem z wszystkich stron. Wydaje mi się że jedyną opcją jest RandomAccesFile albo ByteBuffer z większym wskazaniem na ByteBuffer ale jak widać w moich wypocinach - jakoś mi ten ByteBuffer nie działa. Poza tym zastanawiam się czy ten little endian mam próbować przekonwertować już w buforze czy później. Ogólnie chciałem żeby mi w konsoli pojawiły się normalne dane z tego pliku.

Ps. tak te dane są w little endian . Format jest powszechnie używany do celów medycznych (różnego rodzaju zapisy EEG , EKG itp.)

0

Skorzystaj z DataInputStream i zobacz do metody: http://download.java.net/jdk7/docs/api/java/io/DataInput.html#readShort() . Tam jest wczytywanie big endian. Jak chcesz little endian to odwróc.

0

idąc tropem [losowa nazwa] i donkey7 zrobiłem cos takiego

public class ReadIntFromFile {

    public final static int swabInt(int v) {
        return (v >>> 24) | (v << 24)
                | ((v << 8) & 0x00FF0000) | ((v >> 8) & 0x0000FF00);
    }   

    public static void main(String[] args) throws IOException {
        DataInputStream din = null;
        try {
            FileInputStream fin = new FileInputStream("mmm.rec");

            din = new DataInputStream(fin);
            while (true) {
                int theNumber = din.readInt();
                System.out.println(Integer.toString(swabInt(theNumber), 16));
            }
        } catch (EOFException ex) {
            din.close();
        } catch (IOException ex) {
            System.err.println(ex);
        }
    }
}

wynik jest następujący :

najpierw jest ciąg liczb takiego typu :
20202030
20202020
20462058
20202020
20202020
20202020
20202020
20202020
20202020
20202020
20202020
20202020
20202020
20202020
72617453
74616474
35322065
5250412d
3839312d
20582039
6f502058
616d796c
2020206e
20202020
20202020
20202020
20202020
20202020
20202020
20202020
20202020
20202020... itd itd.

a następnie po pewnym czasie zaczynają się dziać ciekawsze rzeczy :

-df80d09
-eb80dd9
-c68118a
-258a0dc9
-256a13ba
-21892bdb
-313a24ab
-1a391eea
-23da143a
-18d91b7a
-1a19196a
-234a21fa
-18b91fea
-ef813ba
-ca8131a
-6a80b99
-10080e89
-1159128a
-1689179a
-9c8136a
-6780a99
-2b80099
-1680169
f800f8
b800b8
-128fff8
-54801a9
-5f807c9
-4880319
-2880339
-1c800f9
-25802b9
-1480169
-47804a9
-10804b9
2180148
2780428
-5d8ff68
-12802f9
-5801d9
2380158
448ff37
-9800e9
-2980369
178fe17
2480058
c800e8
10801c8
-d8ff88
-4803f9
-18ff28
29800d8
-38fef8
2180138
-180039
-258fe78
1a80108
-2380359
b8ff07
-480269
1d8fdd7
3380188
5b804a8
1f80488
2f801c8
38804b8
37803e8
2a803b8
1b800f8
3980268
4980458
-78fe68
780008
2980028
2080208
-108fe28
-14801a9
118ff37
4a802b8
4980468
33803c8
2580508
-d80229
-1780239
-298fea8
-2d80069
-1780259
1a80198
2680348
3b80228
34804b8
2f801e8
1d80078
2280258
5480538
d80438
-38801c9
-25803a9
-d80269
98fd47
480178
-3880109
-6580639
-5480539
-1a804b9
-2380589
-3f800b9
98ffd7
9800d8
53805b8
1a802f8
b80018
-980309
1f80078
1f80228
680158
c80108

Wydaje mi się że tamte pierwsze odnoszą się do nagłówka w którym zapisane są informacje dotyczące pliku a te drugie to już dane które mi są potrzebne.... tylko mają jakieś dziwne cyfry i liczby...jakby zapis szesnastkowy(ale są minusy :/ )...

0

Podałeś 16 jako radix, czyli postawę systemu liczbowego, to wyszły ci liczby w systemie szesnastkowym. Liczby w takim systemie też mogą mieć minusy, tak samo mogą mieć częśc ułamkową. System dziesiętny to nie jest jedyny możliwy system.

Najpierw musisz pominąć cały główny header, a potem dla każdego sygnału wczytać header dla sygnału a potem surowe dane.

20h = 32 = " " (tzn to jest kod ASCII spacji)

0

a czy brak pominięcia nagłówka spowoduje jakieś problemu z dalszym odczytem danych zawartych w pliku ?

ps. czyli mam rozumieć że to co otrzymałem to już moje prawdziwe dane tylko że są zapisane w systemie szesnastkowym tak?

zastanawiam się także nad jednym....

Ten plik zawiera informacje z badania - są to wartości zmiennoprzecinkowe a zapisane są jako intiger. Jak z intiger uzyskać wartości po przecinku.

Jeżeli mamy np pewną liczbę int i to żeby ją zapisać do np float f używamy czegoś takiego : int i = (int)f;
Ale w tym przypadku do zmiennej i zostaną dopisane tylko zera do przecinka :/

0

Człowieku!

Wszystkie odpowiedzi masz na tej stronie co podałeś.

  1. Plik jest podzielony na kawałki, z czego każdy kawałek ma własny header. Rozmiaru kawałka nie da się wywróżyć, trzeba go odczytać z headera.

  2. Obsługa floatów i longów jest tutaj: http://www.edfplus.info/specs/edffloat.html

Przeczytaj cały materiał na tej stronie w końcu i użyj mózgu.

0
donki7 napisał(a)

Przeczytaj cały materiał na tej stronie w końcu i użyj mózgu.

Dlatego wlasnie u nas w firmie javovcy maja refundowane znizki na psychotropy ;)

0

u mnie w firmie nie ma żniżek-nawet nie można dostać za 100% ceny. Potem człowiek musi kompinować na lewo by coś dostać. Zazdroszczę firmy. Ale prawda taka ze z zażywaniem trza uważać-weźmie człowiek po nie przespanej nocy na pusty żołądek i ...

PS: Jak bierzecie to pijecie kawę czy odstawiacie?

0

Ciesz się Egon że tobie refundują wazelinę.

0

fuck....faktycznie :/ .... nie zauważyłem tego linku :/ teraz mi się już wszystko rozjaśniło :) dzięki za podpowiedź :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1