- me estoy comunicando con un servidor que necesita cadena terminada en nulo
- ¿Cómo puedo hacer esto inteligentemente en C#?
Respuesta
Supongo que está implementando algún tipo de protocolo binario, si las cadenas tienen terminación nula. ¿Estás usando un BinaryWriter
?
El valor predeterminado BinaryWriter
escribe cadenas como prefijo de longitud. Puede cambiar ese comportamiento:
class MyBinaryWriter : BinaryWriter
{
private Encoding _encoding = Encoding.Default;
public override void Write(string value)
{
byte[] buffer = _encoding.GetBytes(value);
Write(buffer);
Write((byte)0);
}
}
a continuación, puedes escribir cualquier cadena como esta:
using (MyBinaryWriter writer = new MyBinaryWriter(myStream))
{
writer.Write("Some string");
}
Es posible que tenga que ajustar el bit _encoding
, dependiendo de sus necesidades.
Puede, por supuesto, expandir la clase con necesidades específicas para otros tipos de datos que pueda necesitar transferir, manteniendo su implementación real del protocolo agradable y limpia. Probablemente también necesite su propia (muy similar) BinaryReader
.
Agrega un carácter nulo al final de la cadena. Las cadenas .NET pueden contener caracteres nulos.
Me gusta este "\ 0"? –
Creo que está sugiriendo 'char c = new char()', que creará el punto Unicode 'U + 0000'. –
Las cadenas ya están cerradas. Aunque la cadena en sí misma no contiene un carácter nulo, un carácter nulo siempre sigue la cadena en la memoria.
Sin embargo, las cadenas en .NET son unicode, por lo que se almacenan como UTF-16/UCS-2 en la memoria, y el servidor puede esperar una codificación diferente, generalmente una codificación de 8 bits. Entonces tendría que codificar la cadena en una matriz de bytes y colocar un byte cero al final:
byte[] data = Encoding.Default.GetBytes(theString);
byte[] zdata = new byte[data.Length + 1];
data.CopyTo(zdata, 0);
(La matriz se ZDATA toda llena de ceros cuando se crea, por lo que no tiene que fijar la realidad byte extra a cero.)
Se corrigió un error tipográfico menor. No estoy muy contento con la asignación de doble buffer personalmente. Puedes soslayar eso. Por otra parte, no es probable que las cuerdas sean de volumen enorme o muy alto. – Thorarin
"Nulo terminado" generalmente significa "terminando en el primer nulo". Las cadenas .NET no se pueden considerar terminadas en nulo si también se permite que una cadena .NET pueda contener uno o más caracteres nulos y aún no terminar –
"Las cadenas ya están terminadas. Aunque la cadena en sí no contiene un nulo carácter, un carácter nulo siempre sigue la cadena en la memoria ". Nunca escuché esto antes y no vi información sobre esto en los documentos de MSDN. ¿Podrías publicar una fuente? – Juliet
Creo que la manera inteligente es hacerlo simplemente.
string str = "An example string" + Char.MinValue; // Add null terminator.
luego convertirlo en bytes a enviar al servidor.
byte[] buffer = ASCIIEncoding.ASCII.GetBytes(str);
Por supuesto, la codificación que utiliza depende de qué codificación espera el servidor.
char.MinValue es la verdadera forma de C# –
Esta es la forma más simple (y más confiable) que he encontrado hasta ahora. Esta debería ser la respuesta aceptada. – jhmckimm
- 1. Uso de printf con una cadena terminada no nula
- 2. Lectura de una cadena terminada en nulo
- 3. ¿Qué es una cadena terminada en nulo?
- 4. Cadena terminada en nulo
- 5. Objective-C cómo comprobar si una cadena es nula
- 6. ¿Cómo puedo convertir una cadena terminada en nulo en un buffer de byte a una cadena en Go? Este
- 7. ¿Cómo imprimo una cadena no terminada en nulo usando printf?
- 8. C++, boost asio, recibir serie terminada nula
- 9. Cadena terminada en cero doble
- 10. ¿std :: string :: c_str() siempre devuelve una cadena terminada en nulo?
- 11. ¿Cómo obtener una línea específica de una cadena en C#?
- 12. Emitir una cadena nula en un entero
- 13. C libcurl obtener salida en una cadena
- 14. ¿Cómo parametrizar una cadena nula con DBNull.Value clara y rápidamente
- 15. obtener la cadena después de una serie de una cadena
- 16. cómo se divide una cadena con una cadena en C#
- 17. cómo convertir una cadena c en una cadena d?
- 18. ToString en cadena nula
- 19. strlen() en cadena de caracteres no terminada en nulo?
- 20. Hacer una cadena nula en una sola línea
- 21. Regex: cómo obtener palabras de una cadena (C#)
- 22. ¿Cómo obtener todas las palabras de una cadena en C#?
- 23. ¿Cómo puedo verificar que una variable C# sea una cadena vacía "" o nula?
- 24. una cadena en C
- 25. Cómo obtener una cadena de anchura
- 26. Cómo obtener un doble de una cadena
- 27. ¿Hay un equivalente strtol que no requiera una cadena terminada en nulo?
- 28. C++ matriz terminada no nula que da como resultado
- 29. C# Dividir una cadena por otra cadena
- 30. Comprobación de una cadena nula antes de la concatenación
Sugeriría utilizar base.Write (this._encoding.GetBytes (new char [] {'\ u0000'})) en su lugar, para codificar el terminador nulo. El UTF-16 predeterminado tiene 2 bytes y espera dos bytes de 0 al final. – toong
Añadir valor con "\ 0" (si no termina con él): 'if (! Value.EndsWith (" \ 0 ")) value + =" \ 0 ";' por lo tanto, hacer la solución ** de codificación -independiente ** (no tiene que preocuparse por la cantidad de ceros). – marchewek