metodos before c# string

before - c#- ¿Se "pierde" la información cuando se usan datos binarios en una cadena?



string methods c# (9)

Como todos los programadores reales saben, la única estructura de datos útil es la matriz. Cadenas, listas, estructuras, conjuntos: todos estos son casos especiales de matrices y se pueden tratar de esa manera con la misma facilidad sin desordenar el lenguaje de programación con todo tipo de complicaciones. Lo peor de los tipos de datos sofisticados es que tiene que declararlos, y los Lenguajes de Programación Real, como todos sabemos, tienen tipeo implícito basado en la primera letra del nombre de la variable (de seis caracteres).

Además, el programador real determinado puede escribir programas Fortran en cualquier idioma.

Quien modificó esto claramente no tiene ni sentido del humor ni conocimiento del folclore. Lo anterior se extrae de una carta muy famosa de 1983 al editor de Datamation, por Ed Post de Tektronix. La carta se titula Real Programmers Do not Use Pascal .

Intenté leer un archivo JPG utilizando el método ReadToEnd() la clase StreamReader , que devuelve una cadena.

Sin embargo, por alguna razón, cuando escribo esta cadena en un archivo, no se abre.

¿Se pierde algo al leer datos en una cadena?


Lamentablemente, hay un problema grave con los nombres de clase en el espacio de nombres System.IO. StreamReader está diseñado para leer / write from / a archivos de texto. Debes usar FileStream para archivos binarios ya que @goodwill sugerirá


Las cadenas se usan para representar texto. Son buenos para representar el texto. Muy bueno, de hecho, ya que son compatibles con Unicode y lo protegen de todo tipo de errores típicos de procesamiento de cadenas.

No son buenos para representar datos binarios, porque no es para lo que están diseñados. Como mencionas, una matriz de bytes es mucho mejor para esto.

No se trata de que uno sea mejor que el otro, es simplemente idoneidad para el propósito y la comprensión de cuándo elegir uno u otro. Text = string, binary = byte array o stream.


Noté que nadie ha respondido las preguntas reales.

¿Se pierde algo al leer datos en una cadena?

Un archivo JPEG contiene una imagen en lugar de palabras. Esta imagen tiene una representación binaria como una secuencia de bytes. Algunos de esos bytes tienen el valor 0x00 también representado como NUL. En una cadena, un byte que contiene este valor se interpreta como marcando el final de la cadena. Los datos más allá del final de la cadena se tratan como un búfer no utilizado y se ignoran.

Cuando escribe la cadena en un archivo, no se incluye nada que supere el primer NUL. Como resultado, el archivo no es una imagen binaria completa y es rechazado por la lógica de validación del software que intenta interpretarlo como JPEG.

Por lo tanto, los datos generalmente se pierden cuando carga una cadena con datos no textuales. El problema aquí es que efectivamente ha realizado una conversión de tipo no válida, pero ni el compilador ni el tiempo de ejecución lo han detenido, y el resultado es la corrupción de datos.

¿Para qué es realmente bueno?

Varias cosas Como han dicho otros, las cadenas están diseñadas para contener texto. En .NET, las cadenas admiten codificaciones distintas de ASCII simple. También hay un amplio soporte para la manipulación de texto. Busque los especificadores de formato como ayuda para un ejemplo espectacular de manipulación de cadenas.

¿Por qué las cadenas C # usan NUL para el final de la cadena?

Esto es un legado. NUL no es muy bueno para nada y al hacerlo simplifica la clasificación dentro y fuera del código administrado. BSTR hace lo mismo por las mismas razones.


Recuerde siempre que los datos de texto son datos binarios, pero los datos binarios no son datos de texto .


Simplemente no puedes hacerlo de esta manera ... Usa FileStream en su lugar.

No se puede usar una cadena para leer archivos binarios, algunos caracteres no llegarán hasta donde yo sé.


String está diseñado para contener caracteres Unicode; no binario Para binario, use un byte[] o Stream . O una Image etc. para un manejo de imágenes más especializado.

A pesar del nombre, StreamReader es en realidad un TextReader especializado, es decir, es un TextReader que lee desde un Stream . Las imágenes no son texto, por lo que esta no es la opción correcta.


Las cadenas usan la codificación Unicode por defecto, Unicode usa el carácter NUL como un carácter de control, el doble NUL se usa para la terminación, un único NUL se usa para representar un carácter ASCII antes.

Es por esta razón que los datos binarios no se pueden cargar en una cadena.


Las cadenas son para datos de texto . No son para datos binarios; si los usa de esta manera perderá datos (hay codificaciones que puede usar y que no perderán datos si tiene suerte, pero hay problemas sutiles que todavía lo hacen una mala idea) .)

Si realmente está tratando con un archivo, la forma más fácil de leer todo es llamar a File.ReadAllBytes . Si tiene que tratar con un flujo arbitrario, eche un vistazo a "Crear un conjunto de bytes de una secuencia" .