Pergunta

Há alguns dias atrás, perguntei porque não é possível armazenar dados binários , como um arquivo jpg para uma cadeia variável .

A maioria das respostas que eu tenho dito que string é usada para obter informações textuais, como o que estou escrevendo agora.

O que é considerado dados textuais embora? Bytes de uma certa natureza representam um arquivo jpg e os bytes poderia ser representado por valores de bytes de caracteres ... eu acho. Assim, quando dizemos cordas são para informações textuais, há algum tipo de faixa ou lista de caracteres que não são armazenados?

Desculpe se a pergunta parece bobagem. Apenas tentando 'entrar'

Foi útil?

Solução

Eu vejo três grandes problemas com o armazenamento de dados binários em strings:

  1. A maioria dos sistemas assumir uma certa codificação dentro de variáveis ??de cadeia - por exemplo, se é uma string UTF-8, UTF-16 ou ASCII. Novos caracteres de linha também pode ser traduzido dependendo do seu sistema.
  2. Você deve tomar cuidado com restrições quanto ao tamanho das strings.
  3. Se você usar cordas de estilo C, cada caractere nulo em seus dados irá encerrar a corda e quaisquer operações de cadeia realizados só irá funcionar na bytes até o primeiro nulo.
  4. Talvez o mais importante: É confuso - outros desenvolvedores não esperar encontrar dados binários aleatória em variáveis ??de cadeia. E um monte de código que funciona em cordas pode também ficar realmente confuso quando se deparam com dados binários:)

Outras dicas

Eu preferiria para armazenar dados binários como binário, só pensaria em convertê-la em texto quando não há outra escolha, pois quando você convertê-lo em uma representação textual ele não desperdiçar alguns bytes (não muito, mas ele ainda conta) , que é como eles colocaram anexos em e-mail.

Base64 é uma representação boa textual de arquivos binários.

Eu acho que você está se referindo a binário para texto assunto codificação . (Traduzir um jpg em uma string exigiria que tipo de pré-processamento)

Na verdade, nesse artigo, alguns personagens são mencionados como nem sempre apoiado, outra pode ser confuso:

Alguns sistemas têm um caráter mais limitada que eles podem lidar com; Não só eles são não de 8 bits limpos, alguns não pode sequer lidar com todos os caracteres ASCII imprimíveis.
Outros têm limites sobre o número de caracteres que podem aparecer entre as quebras de linha.
Outros ainda adicionar cabeçalhos ou reboques para o texto.

E alguns protocolos mal-visto, mas ainda utilizados usar sinalização in-band, causando confusão se padrões específicos aparecem na mensagem. O mais conhecido é a cadeia "From" (incluindo espaços em) no início de uma linha usado para mensagens de correio separados no formato de arquivo mbox.

Quem quer que disse que você não pode colocar dados 'binário' em uma corda estava errado. Uma seqüência simplesmente representa uma matriz de bytes que você plano mais provável sobre o uso de dados textuais ... mas não há nada que impeça você de colocar todos os dados lá que quiser.

Eu tenho que ter cuidado, porém, porque eu não sei o idioma que você está usando ... e em alguns idiomas \ 0 extremidades da corda.

Em C #, você pode colocar todos os dados em uma string ... exemplo:

byte[] myJpegByteArray = GetBytesFromSomeImage();

string myString = Encoding.ASCII.GetString(myJpegByteArray);

Antes de internacionalização, isso não faz muita diferença. caracteres ASCII são todos os bytes, então strings, arrays de caracteres e matrizes de bytes acabou tendo a mesma implementação.

Esses dias, porém, cordas são muito mais complicado, a fim de lidar com milhares de caracteres de idiomas estrangeiros e as regras linguísticas que vão com eles.

Claro, se você olhar profundo o suficiente, tudo é apenas bits e bytes, mas há um mundo de diferença em como as interpreta computador deles. As regras para "texto" fazer as coisas parecerem direito quando é exibida a um ser humano, mas o computador está livre de macaco com a representação interna. Por exemplo,

No fundo, tudo é apenas bytes. Coisas como cordas e imagens são definidas por regras sobre como solicitar bytes. cordas por exemplo final em um byte com valor de 32 (ou qualquer outra coisa) do jpg não

depende do idioma. Por exemplo, em tipos string Python (str) são realmente byte matrizes, para que eles possam de fato ser usado para dados binário.

C o byte nulo é utilizado para a terminação da corda, para que um aguilhão não pode ser usado para dados binários arbitrários, uma vez que os dados binários podem conter bytes nulos.

Em C # a string é uma matriz de caracteres, e uma vez que um char é basicamente um alias para int de 16 bits, você provavelmente pode ir longe com o armazenamento de dados binários arbitrários em uma string. Você pode obter erros quando você tenta exibir o string (porque alguns valores não podem realmente corresponder a um caractere unicode legal), e algumas operações, como conversões de caso provavelmente irá falhar de forma estranha.

Em suma, pode ser possível em alguns langauges para armazenar dados binários arbitrários em cordas, mas eles não são projetados para este uso, e você pode correr em todos os tipos de problemas imprevisto. A maioria das linguagens têm um tipo byte-array para armazenar dados binários arbitrários.

Eu concordo com Jacobus' responda: No final, todas as estruturas de dados são feitos de bytes. (Bem, se você ir ainda mais fundo: de bits). Com alguma abstração, você poderia dizer que uma string ou um array de bytes são convenções para programadores, sobre como acessá-los.

A este respeito, a string é uma abstração para dados interpretados como um texto. Texto foi inventado para a comunicação entre os seres humanos, computadores ou programas não se comunicam muito bem usando o texto. SQL é textual, mas é uma interface para os seres humanos para dizer a um banco de dados o que fazer.

Assim, em, dados textuais gerais e, portanto, cordas, são principalmente para humano para humano ou humana à interação máquina (dizem que pelo conteúdo de uma caixa de mensagem). Usá-los para outra coisa (por exemplo, a leitura ou gravação de dados de imagem binária) é possível, mas carrega lotes de risco bacause você estiver usando o tipo de dados para algo que não foi projetado para lidar. Isso torna muito mais propenso a erros. Você pode ser capaz de armazenar dados binários em cordas, mbut só porque você é capaz de atirar no próprio pé, você deve evitar fazê-lo.

Resumo: Você pode fazê-lo. Mas é melhor não fazer.

scroll top