Tengo una cadena que necesito para convertir a la equivalente de la matriz de bytes .NET.

Esto debería ser fácil, pero estoy teniendo un cerebro calambre.

InformationsquelleAutor JonStonecash | 2008-10-27

4 Comentarios

  1. 97

    Usted necesidad de utilizar una codificación (System.Text.Encoding) para contar .RED lo que usted espera como el de salida. Por ejemplo, en UTF-16 (= Sistema.Texto.De la codificación.Unicode):

    var result = System.Text.Encoding.Unicode.GetBytes(text);
    • Hay un montón más de codificaciones en el Sistema.Texto.La codificación que sólo Unicode: asegúrese de que usted entiende lo que usted necesita.
    • Joel: por lo tanto, escribí «por ejemplo». ;- ), Pero tu comentario es válido, por supuesto.
    • 🙂 Tratando de ayudar a mostrar que el no UTF16 codificaciones son – yo probablemente podría haber redactado mejor.
  2. 41

    Primer trabajo fuera de la codificación que desea: lo que necesita saber un poco acerca de Unicode primera.

    Trabajo próxima que Sistema.Texto.Codificación que corresponde. Mi Núcleo .NET refcard describe a la mayoría de los más comunes, y cómo obtener una instancia (por ejemplo, por una propiedad estática de Encoding o llamando a un Codificación.GetEncoding.

    Por último, si usted desea que todos los bytes a la vez (que es la forma más fácil de trabajar – llamada De la codificación.GetBytes(string) una vez y listo) o si usted necesita para romper en trozos – en cuyo caso tendrás que usar De la codificación.GetEncoder y luego codificar un bit a la vez. El codificador se ocupa de mantener el estado entre las llamadas, en caso de que usted necesita para hacer un descanso a mitad de camino a través de un personaje, por ejemplo.

    • Usted realmente no necesita la codificación a menos que usted (o alguien más) es en realidad va a interpretar los bytes, no? Para tareas como la compresión, cifrado, ofuscación, etc. la codificación se parece clase de irrelevante… no hay razón para ir a través de los problemas si no es necesario..
    • Que absolutamente hacer. Una codificación define lo que la conversión de una cadena en una matriz de bytes que hace. La compresión y el cifrado son totalmente diferentes asuntos. De lo contrario es como decir que el formato de la imagen no importa cuando se quiere guardar una imagen como un archivo – muchos diferentes formatos de imagen puede ser bueno, pero no tiene que ser un los involucrados, por definición.
    • No puedes simplemente decir byte[] bytes = new byte[str.Length * sizeof(char)]; Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length)? A quién le importa lo que la codificación es (o si la cadena tiene incluso caracteres válidos en el primer lugar), siempre y cuando usted sabe que usted puede conseguir de nuevo en la misma forma al hacer a la inversa?
    • Que el uso de UTF-16. Es todavía una codificación – es sólo que es natural que se utiliza internamente para char. (Y puede que mucho la atención sobre el hecho de que es dos veces tan grande como tiene que ser si la cadena es de todos ASCII.)
    • A la derecha, pero mi punto es, el mero hecho de que el usuario quiere «obtener los bytes» no significa que se necesita para saber lo que la «codificación» medio en todos los… que sólo importa si él la interpretación de de ellos, no sólo trabajar con ellos como una caja negra. (Sobre el problema del espacio: sí, que, obviamente, puede ser un problema, pero bastante a menudo, cuando usted «sólo los bytes», que es irrelevante, ya que me imagino que el caso estaba aquí. Obviamente es beneficioso para saber acerca de las codificaciones, pero no necesita para saber acerca de ellos aquí, no?)
    • No, el usuario no necesita saber la codificación. Sólo porque UTF-16, en cierto sentido, el natural de codificación para .NET no quiere decir que la codificación que se quiere utilizar. El punto de la escritura de los datos para que se pueda leer de nuevo – y que será necesario utilizar la misma codificación. El hecho de que el OP se refiere a «el equivalente de la matriz de bytes» sugiere que son conscientes de que las codificaciones siquiera existe, y es de vital importante entender las codificaciones si vas a convertir entre texto y representaciones binarias.
    • He visto un sinnúmero de la gente no para preservar la información correctamente debido a que no han entendido las codificaciones. En mi experiencia, educándolos sobre el tema es un enfoque mucho mejor que el uso de Buffer.BlockCopy y suponiendo que es lo que quieren.
    • Entonces, ¿qué hacer si algún carácter en la cadena no es válida en la codificación quiere «obtener los bytes» para (tal vez porque alguien otro le dio la cadena, y usted no es responsable de sus contenidos… tal vez tiene uso privado de los personajes, o tal vez ni siquiera digo la codificación)? El uso de cualquier particular de codificación no tiene sentido, porque puede ser que no haya ningún tipo de conversión para sus personajes. Por el contrario, si usted sólo tiene que utilizar el método que he mencionado, entonces no importa si los caracteres son válidos, porque se iba a funcionar correctamente de todos modos.
    • Una cadena no tenía una de codificación (o es siempre la codificación UTF-16). Si la lectura de la codificación UTF-8, que aún terminan en UTF-16 internamente. No es que su método no utiliza un sistema de codificación – es que es implícito, que es una cosa mala de la OMI. Obviamente, usted necesita utilizar un de codificación, pero tratando de onda fuera de la cuestión como si no existiera, es una muy, muy mala idea de la OMI. El mantenimiento de la ignorancia de las codificaciones es no el camino a seguir. Si desea usar la codificación UTF-16, hacerlo de forma explícita (Encoding.Unicode).
    • No entiendo tu comentario de «Una cadena que no tiene una codificación (o es siempre la codificación UTF-16)»… los dos van en contra de uno al otro. Debe un System.String siempre contienen UTF-16? El asunto es que debe ha de obedecer cualquier otra codificación en particular?
    • Siempre es una secuencia de char, que es en sí mismo un código UTF-16 unidad. (No es un punto de código Unicode, nota.) Pero no tiene sentido hablar de «una cadena UTF-8», por ejemplo. Usted puede tener UN «UTF-8 representación de una cadena» (lo cual sería una matriz de bytes), pero eso es un asunto diferente.
    • Yo no lo entiendo. Si usted reclama una string siempre debe contener válido UTF-16 datos, entonces eso es falso ("\uFFFF\uFFFF"). Y si usted está afirmando que no contiene necesariamente válido UTF-16 datos, y que podría representar datos en más de una posible codificación, ruego a la pregunta: ¿qué sentido tiene utilizar Encoding.XXX.GetBytes() en la cadena, cuando usted no sabe lo que la codificación a utilizar? (No es como la gente te la codificación para cada uno de los string objetos de los que se pasan…)
    • Depende de lo que entendemos por «válida». Él siempre contiene el código UTF-16 unidades, por definición. Ellos no tienen a mapa de caracteres Unicode definido, por supuesto… pero todavía están en UTF-16. Así que si usted desea representar algún valor en una variedad privada, puede hacerlo en UTF-16, a continuación, convertir a UTF-8 (o lo que sea) de la codificación de la misma gama de caracteres más tarde. Si usted no sabe lo que la codificación a utilizar, que no que la conversión de bytes a todos. Es como preguntar para guardar una imagen sin especificar un formato de imagen – acaba de decir que no.
    • Lo siento, este es el futuro, no estoy seguro de cómo me perdí el comentario… pero esto tiene el sentido perfecto que necesita para encriptar y comprimir una cadena para el transporte/almacenamiento sin saber (o empatía) ¿qué codificación a utilizar. La codificación no es necesario que vienen en el juego en absoluto en muchos casos como estos.
    • Está bien para comprimir luego descomprimir algunos representación binaria de una cadena sin saber qué codificación está. Es no fino para tratar el comprimido de datos binarios como si fuera texto. En cualquier momento que desee para convertir una cadena a binario o viceversa, que debe saber que la codificación a utilizar, y ser coherente en ambos sentidos.
    • Sí, eso es exactamente lo que he dicho demasiado, ¿verdad? Como siempre que no se trate de interpretar los bytes, entonces usted no necesita preocuparse acerca de la codificación. 🙂
    • Pero alguien se va a interpretar los bytes más adelante. Tienes razón en decir que la compresión/encriptación parte no necesita atención, pero lo que va a más tarde se convertirá de nuevo en una cadena absolutamente no… y si no uno nunca vamos a interpretar los datos, no hay mucho punto en el que estar ahí. Así que, sí, usted todavía necesita para elegir una codificación, y asegurarse de que sea usado de manera consistente. La codificación que se decide utilizar es algo arbitrarias tanto tiempo como se puede codificar todo el texto, aunque afectará al espacio, etc. Arbitrario no es el mismo como irrelevante, aunque.
    • Así que estás diciendo que yo debe elegir una codificación si, por ejemplo, todo estoy haciendo es convertir un string a un byte[], la compresión, y escribir en un archivo, para que mañana pueda leer en una byte[] y descomprimirlo en una string en la misma máquina? Si es así, me parece que para ser un poco chocante de una declaración — ¿por qué la codificación de la materia? Sí, yo soy «interpretación» de la cadena de mañana, pero ¿cómo sería la codificación de ser relevante? La única cosa que importa es que estoy recibiendo lo que se inició con… y eso es todo.
    • Sí, absolutamente. Como tú debe elija un formato de imagen si desea guardar una imagen de disco. El uso de la analogía en cuanto puede. Las cadenas no están hechos de bytes (conceptualmente) con el fin de convertir a bytes, usted tiene que ir a través de algún tipo de conversión… y ese es precisamente el de la codificación.
    • Er… sí, que debe ir a través de algunos de la conversión, que es verdad por definición. Pero no tiene que atención lo que el particular la conversión de es, como largo como una caja negra puede decodificar los bytes para que. A la derecha? Me siento como que debería ser obvio… ¿por qué tienes que cuidar lo que en la caja (la codificación en particular)? Así, usted no necesita tener conocimientos de nada acerca de como funciona (o lo que la palabra «codificación» aun medio!)… todo lo que usted necesita es byte[] GetBytes(string) y string GetString(byte[]) y eso es todo! Y eso es lo que BitConverter hace, sin ningún tipo de codificación molestia.
    • En otras palabras, debería ser perfectamente posible y legítimo que una persona sepa nada sobre las codificaciones (y nunca necesita) y pida la «byte[] representación» de una cadena, si nunca se va a interpretar los bytes. Eso es todo lo que estoy diciendo: — una respuesta que utiliza BitConverter para la conversión (o algo similar) que hacer el trabajo con facilidad, y lo haría sin mencionar la palabra «codificación» incluso una vez, así que en realidad, la codificación no es algo que el OP debe tiene que preocuparse.
    • La codificación de es de la caja negra. Hay un montón de cajas negras para elegir (diferentes codificaciones). Usted no necesita saber nada acerca de la información interna – pero usted necesita recoger a la misma conversión en ambos sentidos. Una respuesta usando BitConverter todavía está recogiendo una codificación – es sólo la elección de no llamar. Preferiría que si me dijo, «Usted tiene que elegir una cadena-a-bytes de conversión, generalmente a través de System.Text.Encoding«? Que es exactamente lo mismo, sólo que en mayor torpeza, declaró la OMI. De nuevo, pensar acerca de los formatos de imagen: usted tiene que elegir el formato para obtener de píxeles en bytes.
    • El punto importante es que un usuario puede pedir para al byte[] representación, porque hay un montón de diferentes opciones disponibles.
    • prefiere que si me dijo, «Usted tiene que elegir una cadena-a-bytes de conversión, generalmente a través de System.Text.Encoding«» — ¡Sí! Exactamente: si usted había dicho que, a continuación, el usuario debe saber nada acerca de Unicode con el fin de lograr su objetivo! Que la diferencia crucial entre Text.Encoding y BitConverter — uno de ellos es para cuando hacer atención acerca de la codificación, y el otro es para cuando la codificación es 100% irrelevante para su objetivo. Es por eso que he comentado aquí: usted dijo que el OP necesita para saber acerca de Unicode, cuando en realidad es irrelevante (sólo el uso de BitConverter).
    • El uso de BitConverter todavía sería hacer una elección, sin darse cuenta de que no son opciones. (También, no puedo encontrar lo que BitConverter método que decir, para ser honesto.) De nuevo, pensar acerca de la versión de la imagen: si alguien le pregunta cómo guardar una imagen de disco, que no se puede pedir a la pregunta natural de qué formato? No veo por qué debería ser controversial para alguien que sepa bastante la diferencia básica entre bytes y caracteres, y la capacidad de elegir diferentes codificaciones. No es como que tiene que aplicar de ellos.
    • Oops, perdón por mencionar BitConverter, me refería System.Buffer.BlockCopy, que puede copiar cualquier primitiva de la matriz (por ejemplo, un char[]) a un byte[] y viceversa… yo estaba pensando en la clase equivocada, lo siento confuso para usted.
    • Como para la imagen de la tarea: es la misma cosa. Si BlockCopy puede realizar la codificación/decodificación en su Picture clase, entonces usted necesita saber nada acerca de los diferentes formatos de imagen (o incluso su existencia), con el fin de lograr lo que usted necesita, si usted nunca va a ser la interpretación de los bytes a ti mismo. No hay necesidad de decirle al usuario a aprender acerca de las Bmp. Es una significativamente menor obstáculo a saltar por encima de (ninguna, en realidad) que el aprendizaje acerca de Unicode!
    • ¿Tiene usted un ejemplo de un .NETO de la clase de imagen que puede manejar Buffer.BlockCopy? Usted no necesita saber por tanto acerca de Unicode, aunque, obviamente, cuanto más, mejor. Pero hacer que se necesita para tomar una decisión. Si desea escribir un StringConverter de la clase de la cual se esconde esa opción, y siempre utiliza Encoding.UTF8 (o lo que sea) entonces adelante – pero todavía estás haciendo una elección, y no creo que en realidad beneficia a nadie para ocultarlo. Más pronto o más tarde, usted está obligado a ejecutar en una situación donde usted necesita entender los conceptos muy básicos de codificaciones, así que ¿por qué no aprender más pronto que tarde?
    • por dejar que la caja negra que decide arbitrariamente en una codificación, y sobre todo confiar en el subyacente .net representación de cadena de caracteres en UTF-16, que presentar a los futuros posibles errores. ¿Qué pasa si una próxima actualización .neto de cambios en el sistema de la manera en que las cadenas están representadas en la memoria? En lugar de «Little-Endian» podría ser Big-Endian, por ejemplo. Supongamos que convertir una cadena en una matriz de bytes a su manera, luego comprimirlo. Después de algunos meses y un .neto de la actualización, se intente descomprimir y volver a convertir a cadena. Pero esta vez va a ser basura! Todo porque Codificación no se especifica explícitamente.
    • Ha sido 5 años, pero mirando hacia atrás parece aún me hizo bastante claro que si o no usted debe especificar una codificación depende de qué es exactamente lo que estamos tratando de hacer. Y tenga en cuenta que esto es no «dejar una caja negra decidir sobre una codificación». En ningún lugar de BlockCopy decidir sobre cualquier codificación, y ese es el punto. por ejemplo, Si lo que necesitas es sin pérdidas de transmisión en un sistema idéntico, debe utilizar el raw bytes, independientemente de si son válidos de acuerdo con cualquier codificación en particular. OTOH, si usted necesita la interoperabilidad, codificar/decodificar.
    • asumiendo que hay raw de bytes en el primer lugar. Lo que ocurre es que .net implementa las cuerdas con una subyacente matriz de char, pero que los detalles de la implementación. Incluso entre los sistemas idénticos, nadie te garantiza que habrá un subyacente de la matriz para obtener raw bytes. Se puede cambiar fácilmente en una lista enlazada o de cualquier otra estructura de datos (poco probable, pero aún así se obtiene el punto). Todavía tendrá que especificar una forma de convertir esa cadena (con esta extraña implementación subyacente) en una secuencia de bytes, y que el camino de la conversión de la cadena de bytes que se llama una codificación.
    • Primero de todo, C# permite fijar una cadena y usar la base de caracteres directamente, así que estás mal de la derecha del palo. En segundo lugar, incluso si ese no fuera el caso, una lista enlazada (o cualquier otra cosa) no cambiaría nada. Cualquiera que sea la implementación subyacente es, usted tiene Buffer.BlockCopy() y string.ToCharArray que te dan raw de bytes que pueden ser utilizados para una perfecta reconstrucción. Ya sea que envíe a alguien para escalar el Monte Everest y el radio de los personajes a la luna y de regreso es hasta el marco y no el de su negocio, y totalmente irrelevantes.
    • Imagine escribir una biblioteca de comunicación para el programa que se ejecuta en dos máquinas, tal vez con la Api de void Send(string), string Receive(). Que que realmente debería ser capaz de transmitir una string por sí mismo al igual que usted transmita un char[] o byte[]. Es realmente no es de la biblioteca del negocio, ya sea que string es UTF-16LE, UTF-16BE o de otra manera. Podría ser totalmente aleatoria de unidades de código para todos los que le importan. Su biblioteca puede y debe hacer su trabajo sin pérdida de transmisión independientemente. Y suponiendo una codificación internamente no sólo es innecesario, que se pierde información.
    • como para la matriz de char, no es una matriz de bytes hasta el tipo de codificación se aplica a ella. BlockCopy no esta codificación, en su caso, incluso si la codificación es sólo la memoria de copia de cada byte de la matriz de char. No necesita ser una de las System.Text.Encodings (como para no perder la información). Cualquier forma de uso para obtener la matriz de bytes es una codificación. Un contrato en ¿cómo conseguir byte[] de la cadena.Si la biblioteca que mencionar es para convertir de ida y vuelta dentro del mismo sistema o sistemas idénticos, sí, usted no necesita especificar la codificación. La biblioteca hace esto para usted.
    • Pero incluso con la misma biblioteca, si se basa en la implementación subyacente, de los errores podría ser introducido. No se puede garantizar el sistema va a ser idéntico a la hora de descodificar sucede. Lo que si .los cambios netos de «Little-Endian» Big-Endian en la parte receptora de la transmisión? ToCharArray se codifican en Little-Endian y FromCharArray en la parte receptora asumirá Big-Endian, lo que resultará en daño de los datos. Claramente tu camino, es una forma de convertir un string a byte[] en .net. Pero claramente especificar una codificación es también otra forma de convertir un string a byte[] y parece más robusto.
    • La pregunta es que está proporcionando lo contrato y si el destinatario debe cuidar o no. Pero en este punto acaba de repetir lo mismo. Yo no tengo nada para agregar. Siéntase libre de pasar.

  3. 18

    Qué Codificación está utilizando? Konrad tiene bastante abajo, pero hay otros por ahí y usted podría conseguir goofy resultados con el mal:

    byte[] bytes = System.Text.Encoding.XXX.GetBytes(text)

    Donde XXX puede ser:

    ASCII
    BigEndianUnicode
    Default
    Unicode
    UTF32
    UTF7
    UTF8

Dejar respuesta

Please enter your comment!
Please enter your name here