# 4-stelliges-Byte-Array in Integer umwandeln geht das?



## Gregor.Schulz (8. Feb 2004)

Gibt es die Möglichkeit ein Array aus 4-Byte in ein integer umzuwandeln ?

```
byte[] b = new byte[4];

b[0] =100;
b[1] =120;
b[3]=97;
b[4]=38;

...//aus b ein integer??
```


----------



## Beni (8. Feb 2004)

Es gibt die Möglichkeit Bitoperatoren zu benutzen:


```
byte[] b = new byte[4];

    b[0] = 100;
    b[1] = 120;
    b[2] = 97;
    b[3] = 38;

    int result = 0;
    int temp = 0;

    for( int i = 0; i < b.length; i++ ){
      temp = b[ b.length - 1 - i ];
      if ( temp < 0 ){        // Das Vorzeichen belegt ja auch ein Bit
        temp = -temp;
        temp += 1 << 7;   // Belegt das 1. Bit
      }
      temp <<= i * 8;   // gleichbedeutend mit    temp = temp * 2^(i * 8)
      result += temp;
    }
```

Vielleicht lohnt es sich, noch von Hand nachzurechnen  :wink: 

Ich gehe davon aus, dass das 1. Bit gesetzt = negatives Vorzeichen bedeutet.
Gebe keine Garantie, dass das überall so ist.

mfg Beni


----------



## Nobody (8. Feb 2004)

kommt ganz drauf an, wie es umgerechnet werden soll:
zusammenzählen
das ganze bitweise betrachten


----------



## Gregor.Schulz (8. Feb 2004)

Jo danke dies klappt, ist aber umständlich.


----------



## Gregor.Schulz (8. Feb 2004)

Bitweise betrachten um mit dem FileReader richtige Integer-Werte aus einer Datei auszulesen
So gehts besser :

```
byte[] b = new byte[4]; 

    b[0] = 100; 
    b[1] = 120; 
    b[2] = 97; 
    b[3] = 38;

int f = b[0];f=f<<24;
int g = b[1];g=g<<16;
int h = b[2];h=h<<8;
int i = b[3];

int k = f|=g|=h|=i;    //k = Wert
```


----------



## Beni (8. Feb 2004)

Also, vielleicht bin ich zu blöd ums zu kapieren:

mal angenommen,

b[0] = 0  = 00 00 00 00
b[1] = 0  = 00 00 00 00
b[2] = -2 = 10 00 00 10
b[3] = -4 = 10 00 01 00

_*Meine Variante:*

Integer, unterteilt in Bytes, die der Algo liefert:
00 00 00 00 / 00 00 00 00 / 10 00 00 10 / 10 00 01 00

theoretisch : = 33412
praktisch : = 33412

*Deine Variante:*

Integer, unterteilt in Bytes, die der Algo liefert:
10 00 00 00 / 00 00 00 00 / 00 00 00 10 / 00 00 01 00

theoretisch : = -516
praktisch : = -4_

Die theoretischen kommen von meinem Überlegungen in Bits.
Die praktischen vom JBuilder, in dem ich beide Codes ausprobiert habe.

Wie man sieht: überhaupt nicht dasselbe  :cry: 

Aber welches der beiden Ergebnisse betrachtest Du nun als richtig?
Ich plädiere für das erste (weil's von mir kommt  :wink:  )

Beni

P.S. der Filereader liefert doch Integer, wobei nur die hintersten 8 Bits benutzt werden? Wäre es nicht einfacher, direkt mit diesen Integern weiterzuarbeiten?

P.P.S. java.io.DataInputStream: hat bereits eine solche Umrechnung: readInt(), aber die funktioniert auch mit Integers, und nicht mit Bytes.


----------



## Beni (8. Feb 2004)

Für positive Bytes bekommen beide dasselbe. Aber wenn die Bytes zuerst von einem Integer in 4 Bytes zerlegt wurden, und nun wird das Ganze wieder rückgängig gemacht, dann vermute ich mal, dass die Beispielzahlen oben durchaus auftreten können.

mfg Beni


----------



## Gregor.Schulz (8. Feb 2004)

Sorry aber habe mich im code vertan :
	
	
	
	





```
RandomAccessFile file = new RandomAccessFile("E:\\irgendwas.lpg","rw");
	file.seek(0);file.writeInt(-512);
	int[] b = new int[4];

	file.seek(0);b[0]=file.read();
	file.seek(1);b[1]=file.read();
	file.seek(2);b[2]=file.read();
	file.seek(3);b[3]=file.read();

                                
                                int f = b[0];f=f<<24;
		int g = b[1];g=g<<16;
		int h = b[2];h=h<<8;
		int i = b[3];

int k = f|=g|=h|=i;    //k = Wert
```

bei mir ist k = -512

Der FileReader liefert zwar ein Integer (aber im grundegenommen ist dies nur ein Byte);

In z.B. dem Header einer .bmp oder .wav datei sind 4 nacheinanderfolgende Bytes zu einem Integer zusammengefasst- da z.B.die Bildbreite oder die Bildhöhe einen hohen Integerwert annehmen können.
Diesen Integerwert kann ich aber mit der methode readInt() der RandomAccessFile nicht direkt lesen
da die Bytes komischer weise in der datei verdreht sind. Also
Integer in Java : Byte3--Byte2--Byte1--Byte0
Integer in der Datei: Byte0--Byte1--Byte2--Byte3.
Um diesen Auszulesen muß ich die einzelnen Bytes drehen.
Du kannst es ja mal versuchen in dem du die Breite eines Bildes aus einer .bmp datei mit der readInt()-methode
zu lesen versuchst.



```
RandomAccessFile file = new RandomAccessFile("c:\\xxx.bmp","r");

file.seek(18);
int BreiteDesBildes=file.readInt();
```


----------



## Beni (8. Feb 2004)

Gregor.Schulz hat gesagt.:
			
		

> Der FileReader liefert zwar ein Integer (aber im grundegenommen ist dies nur ein Byte)


Und das ist der Unterschied.
Zwar ist es tatsächlich nur ein Byte, aber da es als Integer gespeichert ist, verhält es sich bei den Bitoperationen leicht anders.

Was die Verdrehung angeht: das Problem hat mir auch schon ein Knüppel zwischen die Beine geworfen.  :wink: 

Dein letztes Codeschnippsel funktioniert auch bei mir richtig :arrow: Problem gelöst 

Ich denke mal, damit ist das Thema erledigt 8)

Gruss Beni


----------



## Gregor.Schulz (8. Feb 2004)

Wenn dein "Codeschnippsel" funktioniert warum funktioniert es nicht bei mir  ???:L


----------



## Beni (8. Feb 2004)

Keine Ahnung.
Wenn ich das   _file.seek(0);file.writeInt( -512 ); _  nehme, funktioniert es nicht.
Dafür funktionieren sowohl deine 1. als auch meine Lösung nicht, wenn ich 33412 ins File schreibe (die letzte schon)

Überhaupt: -512 wird in den int-Array { 255, 255, 254, 0 } aufgeteilt, ich hätte da eher was wie {-0, 0, 0, 512 } erwartet.
Meine Lösung ist halt leider nicht die Umkehrfunktion des Speicheralgo's :cry:

Wenigstens hast Du jetzt eine Lösung, und erst noch selbst gefunden. :wink:
mfg Beni


----------

