sockets

Hola que tal !!

Estoy trabajando con sockets en java, y me han surgido algunas dudas.

Trato de enviar via socket un String de cierto tamaño (ex. de 200), que viene siendo una cadena que yo formo de variables de varios tipos. Entre ellos de arreglos de bytes, strings, etc.

hago algo como esto:

String nombre="nombre";
byte [] arreglo={120,29,32};

etc..

y despues hago una sola cadena con ellos..para enviarla.

La cuestión es que la aplicación quien va a recibir el string que envio esta hecho en VB 5.0, que es quien va a tratar esos datos.

Bueno, mi duda es: si en el arreglo de bytes quisiera enviar el valor 128, que es un valor que espera recibir, cómo le hago en java, si aqui los valores que acepta son de -128 a 127. y en VB es normal, puesto que un byte acepta de 0 a 256.

Hago una aclaración, la cadena ya lleva convertidos los bytes en su representacion unicode, y es aqui donde no logro entender cómo hecerle, porque los valores negativos no tienen representación unicode o si???...por ejemplo, si envio un -128, que viene siendo el valor 128...ya haciendo el recorrimiento...qué unicode me va a enviar, o el -115...y así...
Ya he provado esto, por ejemplo si envio el -115 su representacion unicode me dice que es el signo "?", pero eso hace para varios valores con signo negativo. Entonces cómo sabrá VB de qué valor realmente se trata??
Hojalá alguien pueda ayudarme a enteder mejor esto....gracias.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

confusión

Estás un poco hiperconfundidísimo con lo de unicode y los bytes. Unicode es para representar texto, no bytes (sí, sí, el texto a fin de cuentas son bytes, pero como sabes, hay distintas codificaciones, una ñ tiene cierto valor en ASCII, otro en ISO-8859-1, otro en Unicode, etc).

OutputStream.write() tiene una variante que acepta un entero, para que puedas enviar 0 a 255 (porque un byte acepta de 0 a 255, no 256 como dices).

Imagen de jtepetate

Tiene razón

Si, tiene razón...un byte acepta valores de 0 a 255 (en VB). Y si en java quisiera en un byte almacenar el valor 128, tengo entendido que en realidad se almacena un -128, eso es cierto??, y cuál sería su unicode???.

Creo que si estoy muy confundido con esto...
Lo que quisiera que me aclararan un poco más, es por ejemplo, si en un arreglo:

byte [] arreglo;

quisiera almacenar en la posición 1 =128, posición 2 =140, o cualquier otro valor mayor que 127; tengo entendido que haciendo un cast, va a almacenar sus valores correspondientes con recorrimiento, ya que en java despues del 127, se va al -128. Cuáles serian sus representaciones unicode de esos valores con signo??.

Gracias una vez más.

Imagen de bferro

El tipo byte en java es un tipo integral con signo

El tipo byte en Java es un tipo integral (ordinal, contable) con signo. Un byte se compone de 8 bits, por lo que tienes 256 combinaciones posibles: desde 0000 0000 a 1111 1111.
Como el tipo byte es con signo, entonces tienes 128 combinaciones para los positivos (el cero incluido dentro de los positivos) y 128 combinaciones para los negativos.
La representación más común para representar valores negativos en la máquina es la aritmética de complemento de 2. Con esa representación el bit más significativo del byte se usa para el signo. si ese bit es 1, entonces el número es negativo; si ese bit es cero el número es positivo.
De esta forma quedan los siguientes rangos:

0000 0000 - 0111 1111 (valores del cero al 127)
1111 1111 - 1000 0000 (valores del -1 al -128)

Entonces una localización de memoria, interpretada como una variable de tipo byte en Java, puede tener valores comprendidos de -128 a +127.

Si Java tuviera por ejemplo el tipo unsigned byte (que no lo tiene) entonces sería de 0 a +255.

Ojo con OutputStream.write(int arg).

A pesar de recibir un entero, solamente envía al flujo el byte menos significativo del entero pasado por argumento. Es un flujo orientado a bytes.
La razón de aceptar un entero es para tener simetría con el método int InputStream.read(), que lee solamente un byte del flujo ( o del buffer) y lo promueve a un entero.

¿Por qué es así? Porque Java decidió indicar el fin de flujo retornando un valor de -1, pero ese valor -1 es un valor válido para un byte en el flujo. Al promover lo leido a entero, el método read, devuelve valores en el rango de 0 a 255 y el valor -1 entonces no es un valor válido y puede usarse en lugar de EOF para indicar fin de flujo.

Imagen de jtepetate

Muchas gracias

Agradezco que me haya aclarado la duda acerca de los bytes, de verdad gracias.

Imagen de beto.bateria

Si no tienes problemas con el

Si no tienes problemas con el ancho de banda que puedes utilizar, podrias convertir los numeros(int, long, etc) a string, solo le necesitarias poner un prefijo, al recibirlo la aplicacion de vb, solo haces la conversion cada ves que encuentres el prefijo. Esto en caso de que VB no haga la convercion de datos bien.