[C#] Como funciona Byte y Encoding

Iniciado por DeMoNcRaZy, 6 Septiembre 2015, 21:25 PM

0 Miembros y 1 Visitante están viendo este tema.

DeMoNcRaZy

Buenas,

Tengo una duda con definición de variables.

Tengo esto:

Código (csharp) [Seleccionar]
byte[] raw = wc.DownloadData(laUrl);

Y funciona correctamente.

Sin embargo intento ponerlo así:

Código (csharp) [Seleccionar]
string raw = wc.DownloadData(laUrl);

Y me subraya la definición de la variable. ¿Qué diferencia hay entre esas dos variables?

He visto que son los sockets también en transmite de mensajes se hace mediante byte[] ¿por qué?



¿Y esta función exactamente que realiza?

Código (csharp) [Seleccionar]
string webData = System.Text.Encoding.UTF8.GetString(raw);

Parece que se codifica... ¿por qué?

Cualquier información adicional la agradecería.
Gracias.

Saludos.
Esta página web no está disponible - Google Chrome

Eleкtro

#1
Cita de: YuseTist en  6 Septiembre 2015, 21:25 PMTengo esto:

Código (csharp) [Seleccionar]
byte[] raw = wc.DownloadData(laUrl);

Y funciona correctamente.

Sin embargo intento ponerlo así:

Código (csharp) [Seleccionar]
string raw = wc.DownloadData(laUrl);

Y me subraya la definición de la variable. ¿Qué diferencia hay entre esas dos variables?

Byte y String son dos types diferentes, además, la primera variable es un Array de Bytes.

Para que la segunda orden te funcionase, deberías utilizar la función WebClient.DownloadString, aunque imagino que eso no es lo que pretendes hacer realmente.
WebClient.DownloadString Method - MSDN

No entiendo muy bien cual es tu duda respecto a eso, ya que se ve claramente que son dos tipos diferentes, pues no es lo mismo un byte que una cadena de texto, aunque esta consista en bytes de datos (concretamente un buffer de 1 byte por cada caracter ANSI o 2 bytes por cada caracter Unicode).




Cita de: YuseTist en  6 Septiembre 2015, 21:25 PM¿Y esta función exactamente que realiza?

Código (csharp) [Seleccionar]
string webData = System.Text.Encoding.UTF8.GetString(raw);

Parece que se codifica... ¿por qué?

Al contrario, se descodifica.

Teniendo un array de bytes (que supuestamente contengan caracteres UTF-8), dicha función decodifica los bytes para representarlos en una cadena de texto usando dicha codificación de texto, UTF-8.

Cuando no estés seguro del propósito de un método, función, o cualquier otro tipo demiembro, es tan simple como que pases el puntero del mouse por encima del nombre del método en la IDE de Visual Studio... de esta manera IntelliSense te informará de todos los detalles incluyendo sus parámetros y no tendrás que preguntar "¿qué hace esto?" o "¿cómo se usa?".
También puedes usar el Object Inspector en la IDE, o recurrir a la referencia online (u offline) de la MSDN:
Encoding.GetString Method (Byte()) - MSDN




Cita de: YuseTist en  6 Septiembre 2015, 21:25 PMHe visto que son los sockets también en transmite de mensajes se hace mediante byte[] ¿por qué?

Por qué los paquetes que se transmiten contienen eso, una serie de bytes, que luego debes interpretar/descifrar.

Saludos








DeMoNcRaZy

Gracias por la respuesta, todo muy razonable.

En MSDN pone lo siguiente:

Cuando se reemplaza en una clase derivada, descodifica todos los bytes de la matriz de bytes especificada en una cadena.


Esto significa que byte[] me codifica dicho mensaje (respuesta)

Código (csharp) [Seleccionar]
byte[] raw = wc.DownloadData(laUrl);

Y luego me lo decodifica:

Código (csharp) [Seleccionar]
string webData = System.Text.Encoding.UTF8.GetString(raw);

Si mal no entendí, ¿funciona ciertamente así? (Corrígeme si me equivoco)
Gracias.

Saludos.
Esta página web no está disponible - Google Chrome

Eleкtro

#3
Cita de: YuseTist en  7 Septiembre 2015, 11:56 AMSi mal no entendí, ¿funciona ciertamente así? (Corrígeme si me equivoco)

hmmm... se podría decir que si.

Te lo intentaré explicar de otra forma por si acaso lo entiendes mejor...

Cita de: MSDNWebClient.DownloadData: Downloads the resource as a Byte array from the URI specified

La función DownloadData descarga "X" y te entrega ese "X" acomodado en un Array de bytes.

¿Qué contiene el Array?, podría ser los bytes que componen ua imagen Bitmap, o un archivo de música, o un string UTF-8 ...cómo supuestamente es en este caso.

Tu tienes unos bytes que sabes que se pueden interpretar en un string legible, y sabes que el string tiene codificación UTF-8, así que usas la función Encoding.UTF8.Getstring para decodificar el contenido, si usases codificación ASCII o UTF32 etc se verian caracteres ilegibles.

Un ejemplo real-world:

Código (vbnet) [Seleccionar]
WebClient wc = new WebClient();
UTF8Encoding enc = new UTF8Encoding();
byte[] data = wc.DownloadData("http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-demo.txt");
string str = enc.GetString(data);

File.WriteAllText("c:\\utf8.txt", str, enc);


Saludos








DeMoNcRaZy

Gracias por la respuestas.
Ya más o menos entiendo su funcionamiento de igual modo lo pondré en practica.
En el MSDN también vi su manejo.

Saludos.
Esta página web no está disponible - Google Chrome