Eu tenho uma byte[]
matriz que é carregada de um arquivo que eu conheço contém UTF-8 .
Em algum código de depuração, preciso convertê-lo em uma string. Existe um liner que fará isso?
Nos bastidores , deve ser apenas uma alocação e uma cópia , portanto, mesmo que não seja implementado, deve ser possível.
Respostas:
fonte
System.Text.Encoding.UTF8.GetString(buf).TrimEnd('\0');
.Há pelo menos quatro maneiras diferentes de fazer essa conversão.
GetString da codificação
, mas você não poderá recuperar os bytes originais se esses bytes tiverem caracteres não ASCII.
BitConverter.ToString
A saída é uma cadeia delimitada por "-", mas não há um método interno do .NET para converter a cadeia em matriz de bytes.
Convert.ToBase64String
Você pode converter facilmente a sequência de saída de volta em matriz de bytes usando
Convert.FromBase64String
.Nota: A sequência de saída pode conter '+', '/' e '='. Se você deseja usar a cadeia de caracteres em uma URL, é necessário codificá-la explicitamente.
HttpServerUtility.UrlTokenEncode
Você pode converter facilmente a sequência de saída de volta em matriz de bytes usando
HttpServerUtility.UrlTokenDecode
. A string de saída já é compatível com URL! A desvantagem é que precisa deSystem.Web
montagem se o seu projeto não for um projeto da web.Um exemplo completo:
fonte
var decBytes2 = str.Split('-').Select(ch => Convert.ToByte(ch, 16)).ToArray();
Uma solução geral para converter de matriz de bytes em string quando você não conhece a codificação:
fonte
Definição:
Usando:
fonte
Converter um
byte[]
para umstring
parece simples, mas qualquer tipo de codificação provavelmente atrapalha a string de saída. Esta pequena função simplesmente funciona sem resultados inesperados:fonte
Usando
(byte)b.ToString("x2")
, Saídasb4b5dfe475e58b67
fonte
Há também a classe UnicodeEncoding, bastante simples de usar:
fonte
UnicodeEncoding
é o pior nome de classe de todos os tempos; unicode não é uma codificação. Essa classe é realmente UTF-16. A versão little-endian, eu acho.Alternativamente:
fonte
Um linq de uma linha do Linq para converter uma matriz de bytes
byteArrFilename
lida de um arquivo em uma string terminada em zero ASCII pura no estilo C seria esta: Útil para ler coisas como tabelas de índice de arquivos em formatos de arquivo antigos.Eu uso
'?'
como char padrão para qualquer coisa não pura ascii aqui, mas isso pode ser alterado, é claro. Se você quiser ter certeza de que pode detectá-lo, basta usar'\0'
, pois desdeTakeWhile
o início garante que uma sequência criada dessa maneira não possa conter'\0'
valores da fonte de entrada.fonte
BitConverter
A classe pode ser usada para converter umbyte[]
parastring
.A documentação da
BitConverter
classe pode ser encontrada no MSDNfonte
Que eu saiba, nenhuma das respostas dadas garante um comportamento correto com terminação nula. Até que alguém me mostre de maneira diferente, escrevi minha própria classe estática para lidar com isso com os seguintes métodos:
A razão para isso
startIndex
foi no exemplo em que eu estava trabalhando especificamente, que eu precisava analisar abyte[]
como uma matriz de seqüências terminadas nulas. Pode ser ignorado com segurança no caso simplesfonte
byteArr.TakeWhile(x => x != 0)
é uma maneira rápida e fácil de resolver o problema de terminação nula.hier é um resultado em que você não precisa se preocupar com a codificação. Usei-o na minha classe de rede e envie objetos binários como string.
fonte
Além da resposta selecionada, se você estiver usando .NET35 ou .NET35 CE, precisará especificar o índice do primeiro byte a decodificar e o número de bytes a decodificar:
fonte
Experimente este aplicativo de console:
fonte
Vi algumas respostas neste post e é possível ser considerado um conhecimento básico completo, pois há várias abordagens na programação em C # para resolver o mesmo problema. É necessário considerar apenas uma coisa sobre a diferença entre UTF-8 puro e UTF-8 com BOM .
Na semana passada, no meu trabalho, preciso desenvolver uma funcionalidade que produza arquivos CSV com BOM e outros CSVs com UTF-8 puro (sem BOM), cada tipo de codificação de arquivo CSV será consumido por diferentes APIs não padronizadas. A API leu UTF-8 com BOM e a outra API leu sem BOM. Eu preciso pesquisar as referências sobre esse conceito, lendo " Qual é a diferença entre UTF-8 e UTF-8 sem BOM? " A discussão do Stack Overflow e este link da Wikipedia " Byte order mark " para criar minha abordagem.
Finalmente, minha programação em C # para os dois tipos de codificação UTF-8 (com BOM e pura) precisava ser semelhante como este exemplo a seguir:
fonte