Estoy convirtiendo algo de VB a C #. Tener un problema con la sintaxis de esta declaración:
if ((searchResult.Properties["user"].Count > 0))
{
profile.User = System.Text.Encoding.UTF8.GetString(searchResult.Properties["user"][0]);
}
Entonces veo los siguientes errores:
Argumento 1: no se puede convertir de 'objeto' a 'byte []'
La mejor coincidencia de método sobrecargado para 'System.Text.Encoding.GetString (byte [])' tiene algunos argumentos no válidos
Traté de arreglar el código basado en esta publicación, pero aún no tuve éxito
string User = Encoding.UTF8.GetString("user", 0);
¿Alguna sugerencia?
searchResult.Properties["user"][0]
? Intentabyte[]
(byte[])
en el resultado de búsqueda?Properties["user"][0]
es. Si está seguro de que es una matriz de bytes, puede emitir asíprofile.User = System.Text.Encoding.UTF8.GetString((byte[])searchResult.Properties["user"][0]);
Respuestas:
Si ya tiene una matriz de bytes, necesitará saber qué tipo de codificación se utilizó para convertirla en esa matriz de bytes.
Por ejemplo, si la matriz de bytes se creó así:
Tendrá que volver a convertirlo en una cadena como esta:
Si puede encontrar en el código que heredó, la codificación utilizada para crear la matriz de bytes debe estar configurada.
fuente
En primer lugar, agregue el
System.Text
espacio de nombresEntonces usa este código
¡Espero arreglarlo!
fuente
También puede usar un Método de extensión para agregar un método al
string
tipo de la siguiente manera:Y úsalo como a continuación:
fuente
ToASCIIByteArray
. Odio cuando descubro que una biblioteca que estoy usando usa ASCII y asumo que está usando UTF-8 o algo más moderno.fuente
fuente
¿Por qué no se debe usar Encoding.Default?
La respuesta de @ Randall utiliza
Encoding.Default
, sin embargo, Microsoft hace una advertencia en su contra :Para verificar cuál es la codificación predeterminada, use
Encoding.Default.WindowsCodePage
(1250 en mi caso, y lamentablemente, no hay una clase predefinida de codificación CP1250, pero el objeto podría recuperarse comoEncoding.GetEncoding(1250)
).Encoding.ASCII
es de 7 bits, por lo que tampoco funciona, en mi caso:... y por qué la codificación UTF-8 debería usarse en su lugar ...
La codificación predeterminada es engañosa: .NET utiliza UTF-8 en todas partes como el valor predeterminado real (las codificaciones de 8 bits se volvieron obsoletas a finales de 20. siglo, marque ie
Console.OutputEncoding.EncodingName
*) por lo que cada constante que defina en el código está codificada de forma predeterminada UTF-8, por lo que este debe usarse a menos que la fuente de datos tenga una codificación diferente.* Este es UTF-8 en mi caso, lo cual es una mentira directa:
chcp
desde la consola de Windows (cmd) devuelve 852, y esto no debe cambiarse, porque los comandos del sistema localizados (como ping) tienen esta página de códigos codificadaSiguiendo la recomendación de Microsoft:
Encoding.UTF8
recomendado por otros es una instancia de codificación UTF-8 y también se puede usar directamente o como... pero no se usa siempre
La codificación de los conjuntos de bytes debería "funcionar" en Unicode en los países occidentales, pero tan pronto como mueva su programa a algunas regiones menos compatibles (como aquí en Europa del Este), es un verdadero desastre: en la República Checa, el uso predeterminado de Windows (¡en 2020!) MS no estándar 852 (también conocido como Latin-2) para consola, 1250 como OEM de Windows, UTF-8 (65001) como .NET (y otros) nuevo valor predeterminado y debemos tener en cuenta que algunos 8 bits de la UE occidental los datos todavía están en 1252, mientras que el antiguo estándar occidental de 8 bits para Europa del Este era ISO-8859-2 (también conocido como Latin-2, pero NO el mismo Latin-2 que 852). Usar ASCII significa texto lleno de tofu y '?' aquí. Entonces, hasta la mitad del siglo XXI, configure UTF-8 explícitamente .
fuente
A partir de la respuesta de Ali , recomendaría un método de extensión que le permita pasar opcionalmente la codificación que desea usar:
Y úsalo como a continuación:
fuente
Encoding encoding = Encoding.Default
los resultados en un error de tiempo de compilación:CS1736 Default parameter value for 'encoding' must be a compile-time constant
El siguiente enfoque funcionará solo si los caracteres son de 1 byte. (Unicode predeterminado no funcionará ya que es de 2 bytes)
Manteniéndolo simple
fuente
char
ystring
son UTF-16 por definición.string
y, por lo tanto, es UTF-16. UTF-16 no es el predeterminado; No hay elección al respecto. Luego se divide enchar[]
unidades de código UTF-16. Luego llama a Convert.ToByte (Char) , que simplemente convierte U + 0000 a U + 00FF a ISO-8859-1 , y destruye cualquier otro punto de código.char
tener 16 bits yConvert.ToByte()
tirar la mitad de ellos.utilizar este
fuente
Un refinamiento a la edición de JustinStolle (el uso de BlockCopy por parte de Eran Yogev).
La solución propuesta es de hecho más rápida que usar la codificación. El problema es que no funciona para codificar conjuntos de bytes de longitud desigual. Según lo dado, plantea una excepción fuera de límite. Aumentar la longitud en 1 deja un byte final al decodificar desde una cadena.
Para mí, la necesidad vino cuando quería codificar de
DataTable
aJSON
. Estaba buscando una manera de codificar campos binarios en cadenas y decodificar de cadena abyte[]
.Por lo tanto, creé dos clases: una que envuelve la solución anterior (cuando se codifica desde cadenas está bien, porque las longitudes son siempre iguales), y otra que maneja
byte[]
codificación.Resolví el problema de longitud desigual agregando un solo carácter que me indica si la longitud original de la matriz binaria era impar ('1') o par ('0')
Como sigue:
fuente
Esta pregunta ha sido respondida muchas veces, pero con C # 7.2 y la introducción del tipo Span, hay una forma más rápida de hacer esto en código inseguro:
Tenga en cuenta que los bytes representan una cadena codificada UTF-16 (llamada "Unicode" en C # land).
Algunas evaluaciones comparativas rápidas muestran que los métodos anteriores son aproximadamente 5 veces más rápidos que sus implementaciones Encoding.Unicode.GetBytes (...) / GetString (...) para cadenas de tamaño mediano (30-50 caracteres), e incluso más rápido para cadenas más grandes. Estos métodos también parecen ser más rápidos que usar punteros con Marshal.Copy (..) o Buffer.MemoryCopy (...).
fuente
Si el resultado de 'searchResult.Properties ["user"] [0]', es una cadena:
El punto clave es que la conversión de una cadena a un byte [] se puede hacer usando LINQ:
Y lo contrario:
fuente
¿Alguien ve alguna razón por la que no hacer esto?
fuente
Convert.ToByte(char)
no funciona como crees que lo haría. El carácter'2'
se convierte al byte2
, no al byte que representa el carácter'2'
. Usar en sumystring.Select(x => (byte)x).ToArray()
lugar.Esto me funcionó
fuente
Puede usar la API MemoryMarshal para realizar una conversión muy rápida y eficiente.
String
se convertirá implícitamente enReadOnlySpan<byte>
, yaMemoryMarshal.Cast
sea como aceptaSpan<byte>
oReadOnlySpan<byte>
como parámetro de entrada.El siguiente punto de referencia muestra la diferencia:
fuente
Esto funcionó para mí, después de eso pude convertir poner mi imagen en un campo bytea en mi base de datos.
fuente