Opções De Javascript Leitura Como Binário


ReadAsBinaryString diz que os dados devem ser representados como uma string binária. Onde: cada byte é representado por um número inteiro no intervalo 0..255. O JavaScript originalmente não possuía um tipo binário (até o suporte do WebGL da ECMAScript 5 da matriz digitada (detalhes abaixo) - foi substituído pelo ArrayBuffer do ECMAScript 2015) e, portanto, eles foram com um String com a garantia de que nenhum caractere armazenado na String seria Fora do intervalo 0..255. (Eles poderiam ter ido com uma matriz de Números em vez disso, mas eles talvez não fossem grandes, as cordas são mais eficientes em memória do que grandes matrizes de Números, pois os Números são de ponto flutuante.) Se você estiver lendo um arquivo que é principalmente texto em um script ocidental ( Principalmente inglês, por exemplo), então essa seqüência vai se parecer muito com texto. Se você ler um arquivo com caracteres Unicode nele, você deve notar uma diferença, uma vez que as strings JavaScript são UTF-16 (detalhes abaixo) e, portanto, alguns caracteres terão valores acima de 255, enquanto uma string binária de acordo com a especificação da API do Arquivo não teria Quaisquer valores acima de 255 (você tem dois caracteres individuais para os dois bytes do ponto de código Unicode). Se você estiver lendo um arquivo que não é texto (uma imagem, talvez), você ainda provavelmente obterá um resultado muito semelhante entre readAsText e readAsBinaryString. Mas com readAsBinaryString você sabe que não haverá qualquer tentativa de interpretar as seqüências de vários bytes como caracteres. Você não sabe se você usa readAsText. Porque readAsText usará uma determinação de codificação para tentar descobrir o que é a codificação de arquivos e depois mapeá-lo para as seqüências UTF-16 JavaScripts. Você pode ver o efeito se você criar um arquivo e armazená-lo em algo diferente de ASCII ou UTF-8. (No Windows, você pode fazer isso por meio do Bloco de notas, como Salvar como um menu suspenso de codificação com o Unicode, com o qual, olhando os dados, eles parecem significar UTF-16 Estou certo de que o Mac OS e os editores do nix têm uma característica similar.) Heres Uma página que despeja o resultado da leitura de um arquivo nas duas formas: se eu usar isso com um arquivo Testing 1 2 3 armazenado no UTF-16, aqui estão os resultados que recebo: como você pode ver, readAsText interpretou os personagens e então eu recebi 13 (o comprimento do Testing 1 2 3) e readAsBinaryString não conseguiu, e eu consegui 28 (o BOM de dois bytes mais dois bytes para cada personagem). XMLHttpRequest. response com responseType arraybuffer é suportado em HTML 5. As cadeias de JavaScript são UTF-16 pode parecer uma declaração estranha e não apenas Unicode No, uma string de JavaScript é uma série de unidades de código UTF-16, você vê pares de substituição como dois JavaScript individuais Mesmo que, de fato, o par substituto como um todo é apenas um personagem. Veja o link para obter detalhes. DigitalFresh: a string é o dado binário. Como você comentou, publiquei um exemplo que pode ajudar. O JavaScript não possui um tipo quotbinaryquot e, portanto, eles foram com um String com a garantia de que nenhum caractere armazenado na string ficaria fora do intervalo 0..255. (Eles poderiam ter ido com uma série de números, em vez disso, mas eles não tinham 39). O exemplo mostra como obter o valor bruto de um quotcharacterquot da string. Ndash T. J. Crowder 30 de junho 10 às 5:09 morpheus: porque essas coisas são assíncronas, não pode extrair exceções que você precisa olhar para a interface para ver se existe alguma maneira assíncrona de relatar erros. E, de fato, o FileReader está ativado para isso. Quando você usa um arquivo: 4747 URL, o domínio do documento é nulo, o que tende a fechá-lo de muitas coisas (eu não sei os detalhes, eu nunca o faço), especialmente. Quando o SOP entra nisso. Tenho certeza de que isso é até o navegador, pelo menos por enquanto, como a parte de segurança da especificação ainda é provisória: w3.org/TR/FileAPI/security-discussion Mas eu não esperaria que funcionasse. Ndash T. J. Crowder Nov 5 10 às 18:12 Muito obrigado TJCrowder - Eu exclui meu comentário para evitar que outros sejam enganados pela minha simplificação, e obrigado por publicar os detalhes - Estou certo de que outros acharão seus comentários muito mais úteis (e lendo o O artigo é realmente uma boa ideia, como você diz, se alguém estiver atrapalhando nesta área). Ndash Brian M. Hunt 30 de dezembro 14 às 14: 16jDataView fornece uma maneira padrão de ler arquivos binários em todos os navegadores. Ele segue a especificação DataView e até o estende para um uso mais prático. Explicação Existem três maneiras de ler um arquivo binário a partir do navegador. O primeiro é baixar o arquivo através do XHR com charsetx-user-defined. Você obtém o arquivo como um String. E você precisa reescrever todas as funções de decodificação (getUint16, getFloat32.). Todos os navegadores suportam isso. Então os navegadores que implementaram o WebGL também adicionaram ArrayBuffers. É um buffer simples que pode ser lido com visualizações chamadas TypedArrays (Int32Array, Float64Array). Você pode usá-los para decodificar o arquivo, mas isso não é muito útil. Tem grande inconveniente, não pode ler dados não alinhados. É suportado pelo Firefox 4 e pelo Chrome 7. Uma nova revisão da especificação adicionou DataViews. É uma visão em torno de seu buffer que pode ler tipos de dados arbitrários diretamente através de funções: getUint32, getFloat64. Somente o Chrome 9 o suporta. JDataView fornece a API DataView para todos os navegadores usando a melhor opção disponível entre Strings, TypedArrays e DataViews. Veja as especificações para uma API detalhada. Khronos. org/registry/webgl/doc/spec/TypedArray-spec. html6. Qualquer código escrito para DataView funcionará com jDataView (exceto se ele escrever algo). Construtor novo jDataView (buffer, offset, comprimento). O buffer pode ser uma String ou uma API de especificação ArrayBuffer O wrapper satisfaz todos os getters de especificações. GetInt8 (byteOffset) getUint8 (byteOffset) getUint8 (byteOffset) getUint8 (byteOffset, littleEndian) getUint16 (byteOffset, littleEndian) getInt32 (byteOffset, littleEndian) getUint32 (byteOffset, littleEndian) getFloat32 (byteOffset, littleEndian) getFloat64 (byteOffset, littleEndian) Especificação estendida O parâmetro byteOffset é Agora opcional. Se você omiti-lo, ele lerá logo após o último deslocamento de leitura. Você pode interagir com o ponteiro interno com essas duas funções. Procurar (byteOffset): move o ponteiro interno para a posição tell (): Retorna a posição atual Adição de utilitários getChar e getString. Adição de createBuffer, um utilitário para criar facilmente buffers com o último tipo de armazenamento disponível (String ou ArrayBuffer). Falhas Somente a API de leitura está sendo embrulhada, jDataView não fornece nenhum método definido. A implementação Float64 em strings não possui precisão total. Primeiro precisamos de um arquivo. Ou você obtém isso através do XHR ou use o utilitário createBuffer.

Comments