# Integer aus InputStream lesen



## theprogrammer12 (4. Okt 2010)

Hi!

Ich habe ein J2ME Spiel und dazu mit C++ und SDL dann einen Editor für die Maps geschrieben.
In den Map-Dateien werden vom Editor einfach nacheinander Integer variablen geschrieben.
Folgende Funktion soll dann in dem Spiel eine solche Datei lesen:


```
public static void LoadLevel(int level, String file) throws IOException
    {
        DataInputStream s = new DataInputStream(Levels.class.getResourceAsStream(file));
        int x, y;
        
        level_width[level] = s.readInt();
        level_height[level] = s.readInt();

        System.out.println("Width: " + level_width[level] + " Height: " + level_height[level]);

        level_start_x[level] = s.readInt();
        level_start_y[level] = s.readInt();
        level_goal_x[level] = s.readInt();
        level_goal_y[level] = s.readInt();

        level_ground[level] = new int[level_width[level] * level_height[level]];
        level_lava[level] = new int[level_width[level] * level_height[level]];

        for(x=0; x<level_width[level]; x++)
        {
            for(y=0; y<level_height[level]; y++)
            {
                level_ground[level][x + y * level_width[level]] = s.readInt();
                System.out.println(level_ground[level][x + y * level_width[level]]);
            }
        }
        for(x=0; x<level_width[level]; x++)
        {
            for(y=0; y<level_height[level]; y++)
            {
                level_lava[level][x + y * level_width[level]] = s.readInt();
            }
        }

        s.close();
    }
```

Allerdings wird aus der Datei leider nur Müll gelesen. Die ersten beiden Werte in der Datei (welche die Breite und Höhe der Map darstellen) sind in der Test-Datei beide 16. Ausgelesen wird aber jeweils 268435456.

Woran könnte das liegen?


----------



## eRaaaa (4. Okt 2010)

theprogrammer12 hat gesagt.:


> Woran könnte das liegen?



readInt() - the next four bytes of this input stream, interpreted as an int.


----------



## theprogrammer12 (4. Okt 2010)

genau das soll es auch tun, nur liest es etwas anderes aus als mein c++ programm


----------



## Marco13 (4. Okt 2010)

Kann mit der Interpretation der byte-Reihenfolge zusammen hängen. Die readInt ist so grob implementiert

```
public int readInt() throws IOException {
        int ch1 = read();
        int ch2 = read();
        int ch3 = read();
        int ch4 = read();
        if ((ch1 | ch2 | ch3 | ch4) < 0)
            throw new EOFException();
        return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
    }
```
Kannst mal sowas machen wie

```
public int readIntFrom(InputStream in) throws IOException {
        int ch1 = in.read();
        int ch2 = in.read();
        int ch3 = in.read();
        int ch4 = in.read();
        if ((ch1 | ch2 | ch3 | ch4) < 0)
            throw new EOFException();
        return ((ch1 << 0) + (ch2 << 8) + (ch3 << 16) + (ch4 << 24)); // Vertauscht!
    }
```


----------

