Cast 0-255 int to byte

Hallo.

Ich habe mir folgende Hilfsmethode geschrieben, um binäre Daten aus dem Web zu laden:

	public static byte[] loadBinary(String strUrl){
		try {
			URL url = new URL(strUrl);
			URLConnection con = url.openConnection();
			byte[] ret = new byte[con.getContentLength()];
			InputStream is = con.getInputStream();
			int i = 0;
			while (true) {
			  byte b = (byte)is.read();
			  if (b < 0)
			    break;
			  ret[i++] = b;
			}
			return ret;
		} catch (MalformedURLException e) {
			//e.printStackTrace();
			throw new HTTPException(e);
		} catch (IOException e) {
			//e.printStackTrace();
			throw new HTTPException(e);
		}
	}

Bedenken habe ich jetzt beim cast von int zu byte, da die methode read() Int-Werte von 0-255 liefert, byte allerdings -128 - 127. Gibt es da Probleme, oder ist das egal da die gesetzten Bits sich eh nicht ändern? Ziel der Daten ist erstmal eine Datei, später dann wieder ein Outputstream ins Web.

In dieser Richtung bekommst du keine Probleme. Solange du wirklich nur die Bits betrachtets und nicht in irgendeiner Weise die Zahlenwerte direkt benötigst. Wie du eben bereits festgestellt hat ist der werte bereich unterschiedlich.
Probleme bekommst du erst wenn du dieses Byte dann wieder in ein Int konvertieren möchtest, dann musst du darauf achten, dass der Byte wert -1 dann auch als int wieder -1 ergibt und nicht wie vl erwartet, 255.

Hier ein Prog das das vl veranschaulicht

    int i = 255;
    System.out.println("int:  "+i);
    byte b = (byte)i;
    System.out.println("byte: "+b);
    int x = b;
    System.out.println("int: "+x);
    int y = x & 0xFF;
    System.out.println("int: "+y);
  }```

Ausgabe:

int: 255
byte: -1
int: -1
int: 255

Wie bereits erläutert bekommst Du da keine Probleme.
Die 0-255 bzw. die -128 - 127 sind ja nur die Darstellung des Wertes als int bzw. als byte. Der Wert ist beides mal der selbe.

Trotzdem hast Du im Code einen Fehler:

Da read Werte bis 255 liefern kann und Du erst auf byte castest und dann aber doch wieder auf int vergleichst, bricht Deine Schleife ab sobald die Methode 255 (int) liefert (s. Code Beispiel von AmunRa)

Besser wäre eher so etwas in der Art:

	int i = 0;
	int value;
	while ((value = is.read()) >= 0) {
		ret[i++] = (byte) value;
	}```
oder Du nutzt gleich die Methode `read(byte[])` dann stellt sich die Frage int/byte erst gar nicht.

Weil byte b = (byte)255 // b=-1 schlägt auch Deine Abbruchbedingung fehl. Du musst den int **vor **der Umwandlung prüfen.

bye
TT

Hallo,

danke für die Antworten. Habe es nun doch mit read(byte[]) gelöst. Kleiner Buffer, welcher wiederum in einen ByteArrayOutputStream schreibt, um nachher den kompletten Streaminhalt als byte[] zu bekommen. Ist vermutlich das einfachste und die beste Lösung.

LG