Alle minuszahlen durch nen Socket werden am anderen ende zu 63?

S

Sicaine

Hi,

ich hab hier nen Server und nen Client. Wenn ich vom Server das Byte -128 durchjage, kommt am anderen ende beim Client ledlich 63 raus. Und das ist bei jedem minuswert so. Aber Reintheoretisch müsste er nicht aus -128 (wenn er den schon rumfummelt) 255 draus machen? Weil er das doch eigentlich auf byteebene übertragen müsste?
Server:
out.write((byte) -47);
Client:
System.out.println(in.read());
ergibt 63 :/
 
Hallo!

Du must das aus dem InputStream gelesene auch wieder in ein byte casten, dann passts:
Code:
/*
 * Created on 30.12.2004
 */
package de.tutorials;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * @author Darimont
 */
public class ClientServerExample {

	public static void main(String[] args) {
		new Thread() {
			public void run() {
				try {
					ServerSocket ss = new ServerSocket(2017);
					Socket s = ss.accept();

					OutputStream os = s.getOutputStream();
					byte i = -128;
					System.out.print("send: ");
					System.out.println(i);
					os.write(i);
					os.flush();

					os.close();
					s.close();

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

		new Thread() {
			public void run() {
				try {
					Socket s = new Socket("localhost", 2017);
					InputStream is = s.getInputStream();

					System.out.print("receive: ");
					System.out.println((byte)is.read());

					is.close();
					s.close();

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

			}
		}
		.start();
	}
}

Gruß Tom
 
Hm daran kanns nicht liegen weil ichs genauso mach. Ich poste mal den relevanten Teil irgendwo muss da ne felasche Einstellung oder so sein:

Server:

Code:
//Hier werden die Streams erzeugt:
in  = new BufferedReader(new InputStreamReader(verbindung.getInputStream()));
			out = new BufferedWriter(new OutputStreamWriter(verbindung.getOutputStream()));

//Hier jage ich das ganze dann raus und zwar aus nem Bytearray. Testweise aber auch ganz am Anfang das out.write((byte) -47) um zu testen aber wenn ich das ganze kurz vorm senden ausgebe, dann steht dort der richtige wert drinnen also -47 oder sonst was.
		byte[] text =tex.a;
		boolean[] txt = tex.b;
		try{
			char array[];
			out.write((byte)-47);
	  		for(int i = 0; i < text.length; i++){
	  			if( txt[i] == true){
	  				out.write(text[i]);
	  			}
	  		}
	  		System.out.println();
	  		out.newLine();
			out.flush();

Client:
Code:
//Hier is nix besonderes den charset mal auskommentiert dürfte aber auch egal sein? Ansonsten gibt es immer 63 aus :/
			in  = new BufferedReader(new InputStreamReader(verbindung.getInputStream()/*,"ISO-8859-1"*/));
		  	out = new BufferedWriter(new OutputStreamWriter(verbindung.getOutputStream()/*,"ISO-8859-1"*/));
	        /*System.out.println(in.readLine());
	        System.out.println(in.readLine());
	        System.out.println(in.readLine());*/
			while(true){
				id = (byte)in.read();
				System.out.print("byte: " + id);
 
alles sehr merkwürdig

wenn du also ein -128 versendes kommt nur ein 63 an ?

da fehlen die beiden obersten Bits - eins könnte ich ja noch nachvollziehen das ist das minuszeichen

-128 = 0xff als hex
63 = 0x3f als Hex

wenn du ein -47 versendest und ein 80 bzw 81 ankommt würde ich es auf das Vorzeichenproblem von Java bei Bytes schieben - aber da fehlt ja noch ein bit :-(

was passiert wenn du ein +127 versendest was kommt dann an?
+127 = 0x7f der grösste Wert der in Byte möglich ist
 
Hallo!

Das Problem ist das du Zeichenorientierte Reader/Writer verwendest im Binäre Daten zu Versenden.

Binäre Daten versendet man mit Streams (InputStream, OutputStream und Derivaten)
wie etwa hier:
Code:
/*
 * Created on 30.12.2004
 */
package de.tutorials;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * @author Darimont
 */
public class ClientServerExample {

	public static void main(String[] args) {
		Thread server = new Thread() {
			public void run() {
				try {
					ServerSocket ss = new ServerSocket(2017);
					Socket s = ss.accept();

					OutputStream os = s.getOutputStream();
					String line;

					os.write(-128);
					os.flush();

					os.close();
					s.close();

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

		Thread client = new Thread() {
			public void run() {
				try {

					Socket s = new Socket("localhost", 2017);

					InputStream is = s.getInputStream();
					System.out.println((byte)is.read());
					is.close();

					s.close();

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

			}
		};

		server.start();
		client.start();
	}
}

Zeichenorientierte Daten versendet man über Reader/Writer und Derivate (BufferedReader, BufferedWriter...usw.) Diese führen eine Konvertierung der Zeichen durch die aus dem zugrundeliegenden Binären Stream gelesen wurden. Da bei dir eben diese Konvertierung durchgeführt wird erhälst du das falsche Ergebnis.

Die Methode int read() an einem Reader returniert zwar einen int (4 byte) der jedoch die Bitsignatur eines Chars (2 byte) beinhaltet und deshalb nicht das gewünschte Ergebnis ausgibt.

Wie gesagt verwende zum versenden von Binären Daten normale Streams und du hast keine Konvertierungsprobleme.

Gruß Tom
 
Zurück