Estou convertendo algo do VB para C #. Tendo um problema com a sintaxe desta declaração:
if ((searchResult.Properties["user"].Count > 0))
{
profile.User = System.Text.Encoding.UTF8.GetString(searchResult.Properties["user"][0]);
}
Eu vejo os seguintes erros:
Argumento 1: não é possível converter de 'objeto' para 'byte []'
A melhor correspondência de método sobrecarregado para 'System.Text.Encoding.GetString (byte [])' possui alguns argumentos inválidos
Tentei corrigir o código com base nesta postagem, mas ainda não obtive sucesso
string User = Encoding.UTF8.GetString("user", 0);
Alguma sugestão?
searchResult.Properties["user"][0]
? Tentebyte[]
(byte[])
no searchResult?Properties["user"][0]
é o tipo . Se você tem certeza de que é uma matriz de bytes, pode transmitir assimprofile.User = System.Text.Encoding.UTF8.GetString((byte[])searchResult.Properties["user"][0]);
Respostas:
Se você já possui uma matriz de bytes, precisará saber que tipo de codificação foi usada para inseri-la nessa matriz de bytes.
Por exemplo, se a matriz de bytes foi criada assim:
Você precisará transformá-lo novamente em uma string como esta:
Se você pode encontrar no código que herdou, a codificação usada para criar a matriz de bytes, então você deve estar definido.
fonte
Primeiro de tudo, adicione o
System.Text
espaço para nomeEntão use este código
Espero consertar!
fonte
Além disso, você pode usar um método de extensão para adicionar um método ao
string
tipo como abaixo:E use-o como abaixo:
fonte
ToASCIIByteArray
. Eu odeio quando descubro que alguma biblioteca que estou usando usa ASCII e suponho que esteja usando UTF-8 ou algo mais moderno.fonte
fonte
Por que Encoding.Default não deve ser usado ...
A resposta de @ Randall é usada
Encoding.Default
, no entanto, a Microsoft lança um aviso contra :Para verificar qual é a codificação padrão, use
Encoding.Default.WindowsCodePage
(1250 no meu caso - e, infelizmente, não há classe predefinida de codificação CP1250, mas o objeto pode ser recuperado comoEncoding.GetEncoding(1250)
).Encoding.ASCII
é 7bit, então também não funciona, no meu caso:... e por que a codificação UTF-8 deve ser usada ...
A codificação padrão é enganosa: o .NET usa UTF-8 em todos os lugares como o padrão real (codificações de 8 bits se tornaram obsoletas no final do século 20. verifique
Console.OutputEncoding.EncodingName
*) para que todas as constantes definidas no código sejam codificadas em UTF-8 por padrão - portanto este deve ser usado, a menos que a fonte de dados esteja em codificação diferente.* Este é UTF-8 no meu caso, o que é uma mentira direta:
chcp
do console do Windows (cmd) retorna 852 - e isso não deve ser alterado, porque os comandos do sistema localizado (como ping) possuem essa página de código codificadaSeguindo a recomendação da Microsoft:
Encoding.UTF8
recomendado por outras pessoas é uma instância de codificação UTF-8 e também pode ser usado diretamente ou como... mas nem sempre é usado
A codificação para matrizes de bytes deve "apenas funcionar" em Unicode nos países ocidentais, mas assim que você move o programa para algumas regiões com menos suporte (como aqui na Europa Oriental), é uma verdadeira bagunça: na República Tcheca, os padrões do Windows usam (em 2020!) MS não-padrão 852 (também conhecido como Latin-2) para console, 1250 como Windows OEM, UTF-8 (65001) como .NET (e outros) novo padrão e devemos ter em mente que alguns países de 8 bits da UE ocidental os dados ainda estão em 1252, enquanto o antigo padrão ocidental de 8 bits da Europa Oriental era ISO-8859-2 (também conhecido como Latin-2, mas NÃO o mesmo Latin-2 que 852). Usar ASCII significa texto cheio de tofu e '?' aqui. Portanto, até a metade do século XXI, defina UTF-8 explicitamente .
fonte
Com base na resposta de Ali , eu recomendaria um método de extensão que permita passar opcionalmente a codificação que você deseja usar:
E use-o como abaixo:
fonte
Encoding encoding = Encoding.Default
resultados em um erro de tempo de compilação:CS1736 Default parameter value for 'encoding' must be a compile-time constant
A abordagem a seguir funcionará apenas se os caracteres tiverem 1 byte. (O unicode padrão não funcionará, pois tem 2 bytes)
Mantendo as coisas simples
fonte
char
estring
são UTF-16 por definição.string
e, portanto, é UTF-16. UTF-16 não é o padrão; não há escolha sobre isso. Em seguida, você divide emchar[]
unidades de código UTF-16. Você então chama Convert.ToByte (Char) , que por acaso converte U + 0000 em U + 00FF em ISO-8859-1 e gerencia outros pontos de código.char
ter 16 bits eConvert.ToByte()
jogar metade deles fora.usa isto
fonte
Um refinamento para a edição de JustinStolle (uso de BlockCopy por Eran Yogev).
A solução proposta é realmente mais rápida do que usar Encoding. O problema é que ele não funciona para codificar matrizes de bytes de comprimento desigual. Como dado, gera uma exceção fora dos limites. Aumentar o comprimento em 1 deixa um byte à direita ao decodificar da string.
Para mim, surgiu a necessidade quando eu queria codificar de
DataTable
paraJSON
. Eu estava procurando uma maneira de codificar campos binários em strings e decodificar da string de volta parabyte[]
.Portanto, criei duas classes - uma que envolve a solução acima (ao codificar a partir de seqüências de caracteres, tudo bem, porque os comprimentos são sempre pares) e outra que lida com a
byte[]
codificação.Resolvi o problema de comprimento irregular adicionando um único caractere que informa se o comprimento original da matriz binária era ímpar ('1') ou par ('0')
Do seguinte modo:
fonte
Esta pergunta foi respondida várias vezes, mas com o C # 7.2 e a introdução do tipo Span, há uma maneira mais rápida de fazer isso no código não seguro:
Lembre-se de que os bytes representam uma sequência codificada em UTF-16 (chamada "Unicode" em C # land).
Alguns testes rápidos mostram que os métodos acima são aproximadamente 5x mais rápidos que suas implementações Encoding.Unicode.GetBytes (...) / GetString (...) para cadeias de tamanho médio (30 a 50 caracteres) e ainda mais rápidas para cadeias de caracteres maiores. Esses métodos também parecem ser mais rápidos do que usar ponteiros com Marshal.Copy (..) ou Buffer.MemoryCopy (...).
fonte
Se o resultado de 'searchResult.Properties ["user"] [0]', for uma sequência:
O ponto principal é que a conversão de uma string em um byte [] pode ser feita usando o LINQ:
E o inverso:
fonte
Alguém vê alguma razão para não fazer isso?
fonte
Convert.ToByte(char)
não funciona como você pensa. O caractere'2'
é convertido no byte2
, não no byte que representa o caractere'2'
. Use emmystring.Select(x => (byte)x).ToArray()
vez disso.Isso que funcionou para mim
fonte
Você pode usar a API MemoryMarshal para realizar uma conversão muito rápida e eficiente.
String
será implicitamente convertido paraReadOnlySpan<byte>
, comoMemoryMarshal.Cast
aceita umSpan<byte>
ouReadOnlySpan<byte>
como um parâmetro de entrada.O benchmark a seguir mostra a diferença:
fonte
Este trabalho para mim, depois disso eu pude converter colocar minha foto em um campo bytea no meu banco de dados.
fonte