0xc0 Binary Options


Explorando JPEG Este arquivo é um arquivo HTML e um programa Haskell alfabetizado. Se você renomeá-lo para. lhs você pode compilá-lo com GHC 6.6. Este é um decodificador JPEG funcional, se limitado. Ele só decodifica tons de cinza, imagens de 8 bits e é excessivamente sensível às opções usadas. Eu pensei que as pessoas podem gostar de aprender um pouco sobre o padrão JPEG. Francamente, você pode simplesmente ignorar todo o código se você não entende Haskell. Um bitstream JPEG consiste em vários segmentos. Cada byte no arquivo pertence a um segmento e cada segmento segue um formato comum: 0x01. 0xfe (tipo de segmento) comprimento do cabeçalho (frequentemente incluído, mas não sempre) Após o cabeçalho bytes de comprimento pode vir um fluxo codificado de bytes. Se o fluxo codificado de bytes contiver um 0xff. Um 0 x 00 é recheado depois para se certificar de que o 0xff isnt confundido com o início do próximo cabeçalho. Eu vou colocar no primeiro pedaço de código agora, então eu tenho que obter o módulo de coisas fora do caminho. Você pode ignorar este são todos os módulos padrão, exceto para BitSyntax que é um módulo auxiliar para análise de formatos binários. Agora, heres o código que leva um arquivo JPEG e retorna uma lista de segmentos. Ele procura o marcador de início de segmento e retorna uma lista de tipos de segmento eo corpo desse segmento. Seu um pouco frouxo porque não pula o cabeçalho do segmento para aqueles segmentos que têm um comprimento. Assim é possível que ele vai encontrar um marcador nos cabeçalhos. No entanto, basta para as nossas necessidades. Neste ponto Ill apresentar nossa imagem de teste: Executando jpegSegments neste arquivo dá os seguintes segmentos Tipo de segmento Comprimento do segmento O segmento APP0 marca este arquivo como um JFIF / JPEG. JFIF define alguns campos extras (como a resolução da imagem e uma miniatura opcional) e você pode descobrir mais sobre isso aqui. Quase todos os JPEGs encontrados na natureza serão arquivos JFIF. O esboço do arquivo JPEG é que ele contém um quadro (imagem) e que o quadro pode uma das varreduras mais. As varreduras podem dar progressivamente mais detalhes, ou podem ser eixos diferentes do espaço de cores etc. Para este exemplo, temos apenas uma varredura e apenas um eixo de espaço de cor (luminância, por causa de sua escala de cinza). As tabelas de quantificação e Huffman são necessárias para a descodificação da imagem, então a primeira coisa que fazemos é analisar e armazenar as informações neles. Bem estar armazenando as informações em uma estrutura: Pode haver muitas tabelas Huffman e quantisation definidas e varreduras diferentes podem usar tabelas diferentes. Então, nós armazenamos um mapa de tabelas, embora só esperamos um. Primeiro analisamos a tabela de quantificação (o segmento é chamado DQT na especificação JPEG e você verá esses nomes de tripleto aparecendo de vez em quando). Não se preocupe com o que uma tabela de quantificação é ainda muito, bem chegar a isso mais tarde, é basicamente apenas uma matriz de valores de 64. O segmento de tabela de quantificação se parece com: 0xdb (tipo de segmento) comprimento de precisão de segmento em 64 elementos de u8 ou U16 valores de quantificação em ordem ziguezague As últimas três linhas são repetidas para o comprimento do segmento. Heres o código de análise Huffman codificação Im indo para assumir que você sabe o que Huffman codificação é, se não você pode ler sobre ele. JPEG define um modo para Huffman e codificação aritmética, mas, devido a questões de patentes, apenas Huffman é visto na natureza. A codificação aritmética é mais lenta, mas obtém cerca de 10 compressão melhor para arquivos JPEG. As árvores de Huffman em JPEG nunca são mais profundas do que 16 elementos e são comunicadas com duas listas. O primeiro é 16 elementos de comprimento e dá o número de valores em cada profundidade na árvore. (Assim, o primeiro elemento dá o número de valores que são apenas um passo da raiz da árvore, o segundo o número que são dois passos, etc). A segunda lista é uma lista de elementos, por ordem de profundidade. O padrão JPEG fornece uma definição muito complexa de como construir as árvores de Huffman (o que parece ser um caso de otimização prematura). O algoritmo real é o seguinte: Comece com uma árvore vazia Para cada par (elemento, profundidade) na lista de elementos (em ordem): Vá passos em profundidade a partir da raiz, sempre indo para a esquerda em cada etapa se há espaço para fazê-lo. (Os elementos estão sempre nas folhas das árvores, então se a subárvore esquerda é um elemento, ou é uma árvore totalmente terminada por elementos, você não pode ir para a esquerda) Onde você parar, insira o elemento Heres nossa estrutura de árvore: Cada nó no Árvore está vazia. Full (um nó folha, com no elemento Int) ou uma árvore com uma fullness-flag, e leftright filhos. O sinalizador de plenitude para cada nó de árvore é verdadeiro se não mais elementos podem ser inseridos nele. Isso nos poupa da necessidade de retroceder. O tipo Branch é usado para armazenar os passos que levamos para inserir o elemento. Isso é necessário se você está indo para implementar uma pesquisa de tabela rápida (não estamos neste caso, por isso é apenas um exemplo.) Heres a função para adicionar um elemento para a árvore. Você pode verificar os padrões, se quiser: Construir uma árvore é apenas um caso de chamar huffTreeAdd para cada par (profundidade, elemento) na tabela Huffman. Nós jogamos fora o caminho de Branch es, mas isso é onde você iria construir uma tabela de pesquisa se você queria velocidade. Olhando acima valores da árvore é muito simples, você apenas anda a árvore até que você bate um elemento. Esta função usa uma lista de Bool s como uma lista de bits onde true significa tomar a subárvore direita. Retorna o elemento e a lista restante de bits. Agora que você conhece a teoria, há apenas a questão de como ler os bytes. Lembre-se que só precisamos da lista de comprimentos e da lista de elementos, a partir da qual o layout do segmento é óbvio: elementos, por ordem de profundidade Como as tabelas de quantização, as últimas quatro linhas são repetidas para o comprimento do segmento. Heres a função de análise, retorna a classe, id e uma lista de pares (de profundidade, elemento): Existem dois outros segmentos que precisamos analisar, o início da moldura eo início da digitalização. Seus formatos exatos não são importantes, eles contêm o que você esperaria: a largura ea altura da imagem, número de componentes (eixo de espaço de cor) e quais tabelas para usar na decodificação: Theres também uma função que traduz os valores de retorno destas parsing Funções em mudanças na estrutura JpegState (que nós definimos maneira acima se você lembrar): A Transformação de Coseno Discreto estavam quase prontos para começar a decodificar o coração de JPEG - o DCT. Ao codificar uma imagem, sua divisão em 8x8 quadrados de pixels. Cada um desses quadrados é então transformado através da DCT (que é totalmente reversível). Você pode pensar no DCT como alterando os pixels do tempo para o domínio da freqüência: o gráfico tempo vs amplitude de uma forma de onda está no domínio do tempo ea parcela de frequência vs amplitude (como você vê em um equalizador gráfico) está na freqüência domínio. O DCT é totalmente reversível. Você também pode pensar no DCT como uma função que transforma uma grade de 8x8 pixels em uma combinação linear das seguintes funções de base gráfica: Existem 64, 8x8 imagens lá. O superior esquerdo é chamado de componente DC e todo o resto são componentes AC. Esperançosamente você pode ver que um bloco 8x8 contínuo é sempre alguma fração do azulejo esquerdo superior. Se o bloco 8x8 desvanece-se para o fundo, adicione então dentro pouco da telha imediatamente abaixo. Pode não ser óbvio que todos os blocos de 8x8 pixels podem ser representados como combinações lineares dessas telhas, mas é verdade. A componente DC é a onda de coseno que não faz ciclos sobre o bloco 8x8. Indo um azulejo à esquerda, essa é a onda de coseno que faz metade de um ciclo sobre o bloco. Próxima telha ao longo faz um ciclo sobre o bloco e assim por diante. Ir para esquerda aumenta a frequência horizontal e descer aumenta a frequência vertical. No entanto, o olho humano tem sensibilidades diferentes nestas frequências. A maioria das telhas de alta freqüência pode ser jogada fora sem qualquer efeito perceptível. Este jogando fora é gerenciado dividindo a amplitude de cada ladrilho por um número fixo na esperança de que muitos deles vão para zero. Quanto maior o divisor, menor a qualidade e os divisores são ponderados de modo que os componentes de alta freqüência são divididos por um número maior. A lista de divisores é a tabela de quantificação que tratamos antes. Você pode executar o DCT correlacionando os valores de pixel com as funções coseno, que, para o caso 1-d, é o mesmo que multiplicando pela matriz DCT: Como cada linha é ortogonal, o inverso dessa matriz é apenas sua transposição. Representamos uma matriz como uma lista de linhas, onde cada linha é uma lista de valores. Isto nos dá as funções de transposição, vetorvector, matrizvector e matrixmatrix: Também podemos definir a matriz DCT 8x8 inversa: codificação DCT Agora entendemos que para decodificar a imagem precisamos apenas obter os coeficientes DCT para cada bloco 8x8, multiplicar pela quantificação Tabela e executar a DCT inversa para obter os valores de pixel. A questão restante é como decodificar os coeficientes DCT. Primeiro, os blocos 8x8 são codificados em ordem de varredura (da esquerda para a direita, de cima para baixo) e, onde a imagem não é um número inteiro de blocos de 8x8, os pixels mais à direita e mais baixos são repetidos para torná-lo assim. Para cada bloco 8x8 o coeficiente DC é codificado primeiro usando uma tabela de Huffman e os coeficientes de AC seguem (todos os 63 deles) usando outra tabela de Huffman (e outro esquema de codificação). Ambos DC e AC usam o mesmo esquema de codificação inteiro, no entanto, que é o que bem cobrir próxima: Um número inteiro é codificado por Huffman codificação seu intervalo e, em seguida, twos complementar a codificação do deslocamento dentro desse intervalo. Os intervalos têm a seguinte aparência: SSSS (número de intervalo) O valor SSSS é o elemento da árvore Huffman (para DC) eo número de bits de arrasto. Portanto, se você decodificar 3 da árvore de Huffman, você toma os três bits a seguir do fluxo de bits. O primeiro desses bits é verdadeiro se você está contando a partir do fundo da subrange positivo e false se você está contando a partir do fundo da subrange negativo. Os dois últimos são o número a ser adicionado a esse valor base: O valor DC de cada bloco DCT é codificado como a diferença do valor DC do último bloco decodificado. (O valor DC do bloco antes do primeiro é considerado 0). Este código não faz a diferença, apenas decodifica o valor: os valores AC são um pouco diferentes. Em primeiro lugar, há 63 deles em cada bloco e geralmente há longas corridas de zeros entre valores. Assim, a árvore AC Huffman decodifica dois valores: um valor SSSS (nos 4 bits inferiores), tal como acima e um valor RRRR (nos quatro bits superiores), que dá o número de zeros anteriores. Portanto, se a árvore AC Huffman decodifica um valor de 0x53, isso é SSSS 3 e RRRR 5 e resulta nos valores 0, 0, 0, 0, 0, x. Onde x está na gama -31 ..- 16,16..31. Você decodificar os três bits a seguir para localizar o valor exato para x. Existem também códigos especiais para 16 zeros (0x00) e para terminar os valores de CA para este bloco (0xf0) uma vez que os blocos terminam frequentemente com muitos valores zero. Claramente, a codificação Huffman dos valores AC funciona melhor quando há lotes de execuções de zeros e muitos zeros no final. Componentes de alta freqüência são susceptíveis de ser quantised a zero, mas se tomarmos os valores de CA em ordem raster, os componentes de freqüência mais alta não estarão sempre no final. Assim, os valores de CA são codificados em ordem ziguezague. Heres um diagrama: E heres o código: Estamos, finalmente, pronto para decodificar o JPEG, mas primeiro eu preciso para obter algumas funções auxiliares fora do caminho. Os dois primeiros (groupSize e d8ru) são triviais. O último, bytesToBits converte um bloco de dados de memória em uma lista de bits, removendo o 0x00 recheado após cada 0xff (lembre-se que esses bytes recheados são colocados lá para parar os dados de Huffman parecendo o início do próximo segmento). Agora, a função de decodificação. Ive adicionou comentários no final de algumas das linhas para que você possa acompanhar. Primeiro vamos descobrir quantos blocos DCT existem (0), este é apenas o número de blocos em uma linha vezes o número de linhas sobre a altura de um bloco. Em seguida, (1) decodificamos o delta DC e adicionamo-lo ao último valor DC (2). Então podemos decodificar todos os valores AC (3) e multiplicar todos os coeficientes DCT pela tabela de quantificação (4). Finalmente des-ziguezague e realizamos a DCT inversa (5) e foram feitas. Isto é feito para cada bloco DCT no arquivo e nós terminamos com uma lista de 8x8 matrizes de valores de pixels. Esses valores de pixel são de -128 a 128 (porque o DCT funciona melhor quando eles são simétricos em torno de 0). Devido a alguns erros de arredondamento, os valores reais podem exceder esse intervalo e, portanto, precisam ser fixados no tempo de saída. Acabamento A última função fornece a lista de matrizes de valores de pixels para um arquivo PGM. Percorremos cada linha de valores de DCT oito vezes para obter cada linha de varredura (0) e, para cada valor de pixel, somamos 128 e prendemos o intervalo (1). E então theres a função principal que apenas faz um decodificador de exemplo que lê de test. jpeg e escreve para out. pgm. Heres o resultado (convertido em um PNG): int crc32 (string str) 32- (CRC32) str. . PHP, 32-. 64- crc32 (). Quotuquot sprintf () printf () crc32 (). Quotxquot sprintf () printf (). Dechex (). Crc32 (). 64-,, 0xFFFFFFFF. , 50 32- 64-. , (Md5 ()). jogo da velha(). Hash (quotcrc32bquot, str), strpad (dechex (crc32 (str)), 8, 0390039, STRPADLEFT). Crc32 str. 1 CRC32 printf (). Ltphp checksum crc32 (A rápida raposa marrom saltou sobre o cão preguiçoso.) Printf (soma de verificação única) gt hash () - - () md5 () - MD5- sha1 () - SHA1- Notas do Contribuidor 22 notas MODBUS RTU, CRC16 , Entrada-gt modbus rtu string saída - gt 2bytes string, na ordem correta de modbus ltphp função crc16 (string comprimento 0) auchCRCHi matriz (0x00 0xC1 0x81 0x40 0x41 0x01 0xC0 0x80 0x41 0x81 0x40 0x01 0x40 0x40 0x41 0x00 0xC1 0x81 0x40 0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41 0x01 0xC0 0x80 0x41 0xx 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x. 0x00 0x40 0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41 0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41 0x01 0xC0 0x80 0x41 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0xCx 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0 0 x 0 0 x 0 0 x 41 0 x 0 0 x C 1 0 x 81 0 x 40 0 ​​x 0 0 x 0 0x64 0x41 0x64 0xC0 0x00 0x41 0x81 0x40 0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41 0x01 0xC 0x80 0x41 0x00 0xC1 0x81 0xx 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x . 0x40. 0x01. 0xC0. 0x80. 0x41. 0x00. 0xC1. 0x81. 0x40. 0x00. 0xC1. 0x81. 0x40. 0x01. 0xC0. 0x80. 0x41. 0x01. 0xC0. 0x80. 0x41. 0x00. 0xC1. 0x81. 0x40. 0x00. 0xC1. 0x81. 0x40. 0x01. 0xC0. 0x80. 0x41. 0x00. 0xC1. 0x81. 0x40. 0x01. 0xC0. 0x80. 0x41. 0x01. 0xC0. 0x80. 0x41. 0x00. 0xC1. 0x81. 0x40. 0x00. 0xC1. 0x81. 0x40. 0x01. 0xC0. 0x80. 0x41. 0x01. 0xC0. 0x80. 0x41. 0x00. 0xC1. 0x81. 0x40. 0x01. 0xC0. 0x80. 0x41. 0x00. 0xC1. 0x81. 0x40. 0x00. 0xC1. 0x81. 0x40. 0x01. 0xC0. 0x80. 0x41. 0x00. 0xC1. 0x81. 0x40. 0x01. 0xC0. 0x80. 0x41. 0x01. 0xC0. 0x80. 0x41. 0x00. 0xC1. 0x81. 0x40. 0x01. 0xC0. 0x80. 0x41. 0x00. 0xC1. 0x81. 0x40. 0x00. 0xC1. 0x81. 0x40. 0x01. 0xC0. 0x80. 0x41. 0x01. 0xC0. 0x80. 0x41. 0x00. 0xC1. 0x81. 0x40. 0x00. 0xC1. 0x81. 0x40. 0x01. 0xC0. 0x80. 0x41. 0x00. 0xC1. 0x81. 0x40. 0x01. 0xC0. 0x80. 0x41. 0x01. 0xC0. 0x80. 0x41. 0x00. 0xC1. 0x81. 0x40) 0xC 0xC1 0x0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Detalhes 0xC 0xC 0 0x0E 0x0A 0x0E 0x0A 0xCA 0xCB 0x0B 0x8 0xC 0xD 0x18 0x19 0xD9 0x1B 0xDB 0xDA 0x1A 0x1E 0xde 0xDF 0x1F 0xDD 0x1D 0x1C 0xD 0xD 0 x 0 0 x 0 . 0x14. 0xD4. 0xD5. 0x15. 0xD7. 0x17. 0x16. 0xD6. 0xD2. 0x12. 0x13. 0xD3. 0x11. 0xD1. 0xD0. 0x10. 0xF0. 0x30. 0x31. 0xF1. 0x33. 0xF3. 0xF2. 0x32. 0x36 0xF6 0xF7 0x37 0xF5 0x3 0x34 0xF4 0x3C 0xFC 0xFD 0x3D 0xFF 0x3F 0x3E 0xFE 0xFA 0x3A 0x3B 0xFB 0x39 0xF9 0xF8 0x38 0x28 0xE8 0xE9 0x29 0xEB 0x2B 0x2A 0xEA 0xEE 0x2E 0x2 0xE 0x2 0x2 0x2 0x2 0xE4 0x24 0x25 0xE5 0x27 0xE7 0xE6 0x26 0x22 0xE2 0xE3 . 0x23. 0xE1. 0x21. 0x20. 0xE0. 0xA0. 0x60. 0x61. 0xA1. 0x63. 0xA3. 0xA2. 0x62. 0x66. 0xA6. 0xA7. 0x67. 0xA5. 0x65. 0x64. 0xA4. 0x6C. 0xAC. 0xAD. 0x6D . 0xAF. 0x6F. 0x6E. 0xAE. 0xAA. 0x6A. 0x6B. 0xAB. 0x69. 0xA9. 0xA8. 0x68. 0x78. 0xB8. 0xB9. 0x79. 0xBB. 0x7B. 0x7A. 0xBA. 0xBE. 0x7E. 0x7F. 0xBF. 0x7D. 0xBD. 0xBC. 0x7C. 0xB4. 0x74. 0x75. 0xB5. 0x77. 0xB7. 0xB6. 0x76. 0x72. 0xB2. 0xB3. 0x73. 0xB1. 0x71. 0x70. 0xB0. 0x50. 0x90. 0x91. 0x51. 0x93. 0x53. 0x52. 0x92. 0x96. 0x56. 0x57. 0x97. 0x55. 0x95. 0x94. 0x54. 0x9C. 0x5C. 0x5D. 0x9D. 0x5F. 0x9F. 0x9E. 0x5E. 0x5A. 0x9A. 0x9B. 0x5B. 0x99. 0x59. 0x58. 0x98. 0x88. 0x48. 0x49. 0x89. 0x4B. 0x8B. 0x8A. 0x4A. 0x4E. 0x8E. 0x8F. 0x4F. 0x8D. 0x4D. 0x4C. 0x8C. 0x44. 0x84. 0x85. 0x45. 0x87. 0x47. 0x46. 0x86. 0x82. 0x42. 0x43. 0x83. 0x41. 0x81. 0x80. 0x40) comprimento (comprimento lt 0 strlen (string): comprimento) uchCRCHi 0xFF uchCRCLo 0xFF uIndex 0 para (i 0 i lt comprimento i) uIndex uchCRCLo ord (substr (string. I. 1)) uchCRCLo uchCRCHi auchCRCHi uIndex uchCRCHi auchCRCLo uIndex Gt A função khash () por sukitsupaluk tem dois problemas, não usa todos os 62 caracteres do conjunto de mapas e, quando corrigido, produz resultados diferentes em 64 bits em comparação com 32 - bit sistemas PHP. Aqui está a minha versão modificada: / pequeno exemplo converter crc32 para mapa de caracteres Baseado em php. net/manual/en/function. crc32.php105703 (modificado para usar agora todos os caracteres do mapa) (modificado para ser seguro de 32 bits PHP) / Função khash (dados) mapa estático 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ hash bcadd (sprintf (uccc32 (dados)). 0x100000000) str do str mapa bcmod (hash. 62). Str hash bcdiv (hash. 62) enquanto (hash gt 1) return str // -------------------------------- -------------------------------------------------- - matriz de teste (null, true, false, 0. 0. 1. 1. 2. 3. abc abcde abcde abcdefoo 248840027. 1365848013. // hora () 9223372035488927794. // PHPINTMAX-time () 901131979. // mtrand () Sat, 13 Abr 2013 10:13:33 0000 // gmdate (r)) out array () foreach (teste como s) fora khash (s). - benzóico. S print lth3gtkhash () - mapeia um resultado crc32 para um (62 caracteres) resultlt / h3gt print ltpregt vardump (saída) print nnGLOBALSrawcrc32: n vardump (GLOBALS rawcrc32) imprimir lt / pregtlthrgt flush () pefile FILE print lth3gt pefile lt / H3gt obendflush () flush () highlightfile (pefile) imprimir lthrgt // ----------------------------------- ------------------------------------------------ / CURRENT (9) 9aGcIp: 0 4gt string (9) 9aGcIp: 0 5gt string (9) 76nO4L: 1 2gt string (8) 4GFfc4: 3gt string (9) 9aGcIp: 0 4gt string (8) 4gFfc4: 1 corda 6gt (9) 76nO4L: 1 string 7gt (9) 5b8iNn: 2 string 8gt (9) 6HmfFN: 3 string 9gt (10) 7ADPD7: ab string 10gt (11) 5F0aUq: abc 11gt cadeia (12) 92kWw9: abcd 12gt (13) 78hcpf: abcde 13gt seqüência de caracteres (16) 9eBVPB: abcdefoo 14gt seqüência de caracteres (17) 5TjOuZ: 248840027 15gt seqüência de caracteres (18) 5eNliI: 1365848013 16gt seqüência de caracteres (27) 4Q00e5: 9223372035488927794 17gt string (17) 6DUX8V: 901131979 string 18gt 39) 5i2aOW: Sat, 13 Apr 2013 10:13:33 0000 / // -------------------------------- -------------------------------------------------- - Uma maneira mais rápida que eu encontrei para retornar valores CRC de arquivos maiores, é em vez de usar o método file () / implode () usado abaixo, é para nós filegetcontents () (PHP 4 gt 4.3.0) que usa técnicas de mapeamento de memória se Suportado pelo seu sistema operacional para melhorar o desempenho. Heres minha função de exemplo: ltphp // file é o caminho para o arquivo que você deseja verificar. Function filecrc (arquivo) filetring filegetcontents (arquivo) crc crc32 (filestring) retorna sprintf (u. c cr) filetocrc / home / caminho / para / arquivo. Jpg echo filecrc (filetocrc) // Exibe o valor CRC para determinado arquivo. Gt Ive encontrado em testar este método é muito mais rápido para arquivos binários maiores. Bit by bit função de computação crc32 bitbybitcrc32 (str firstcall false) // reflexão em 32 bits do polinômio crc32 0x04C11DB7 polyreflected 0xEDB88320 // 0xFFFFFFFF // mantém registro do valor do registro após cada chamada static reg 0xFFFFFFFF // inicializa o registro na primeira chamada if ( Primeira chamada) reg 0xFFFFFFFF n strlen (str) zeros n lt 4. n. 4 // xor primeiro zerosmin (4, strlen (str)) bytes no registro para (i 0 i lt zeros i) reg ord (str) ltlt i 8 // agora para o restante da seqüência para (i 4 i lt Ni) nextchar ord (str) para (j 0 j lt 8 j) reg ((reg gtgt 1 amp 0x7FFFFFFF) (nextchar gtgt j amp 1) ltlt 0x1F) (reg amp 1) polyreflected // colocar zeros suficientes no final Para (i 0 i lt zeros 8 i) reg (reg gtgt 1 amp 0x7FFFFFFF) (reg amp 1) polyreflected // xor o registro com 0xFFFFFFFF return str 123456789 // qualquer que seja o tamanho do bloco 4 // what for (i 0 i lt strlen Str) i blocksize) crc bitbybitcrc32 i) Esta função retorna um inteiro sem sinal a partir de uma plataforma Linux de 64 bits. Ele retorna o inteiro assinado de outras plataformas de 32 bits mesmo um Windows de 64 bits. A razão é porque as duas constantes PHPINTSIZE e PHPINTMAX têm valores diferentes na plataforma Linux de 64 bits. Eu criei uma função work-around para lidar com essa situação. Ltphp função getsignedint (in) intmax pow (2.31) - 1 if (in gt intmax) out in - intmax 2 - 2 out out in return out gt Espero que isso ajude. Implantação crc64 () em php 64 bits // polinômio ECMA poly64rev (0xC96C5795 ltlt 32) 0xD7870F42 // polinômio ISO // poly64rev (0xD8 ltlt 56) para (i 0 i lt 256 i) para (parte 1 bit 0 bit lt 8 bit ) If (parte 1) parte (parte gtgt 1) amp (0x8 ltlt 60)) poly64rev else parte (parte gtgt 1) amp crc64tab i parte / param string string param string formato return mixed Formatos: crc64 (php) // // php, 0xx) // 0xafe4e823e7cef190 crc64 (php, 0xX) // 0xAFE4E823E7CEF190 crc64 (php, d) // -5772233581471534704 assinado int crc64 (php, u) // 12674510492238016912 não assinado int / função crc64 (string. ) Static crc64tab if (crc64tab null) crc64tab crc64Table () para (i 0 i lt strlen (cadeia) i) crc crc64tab (crc ord (cadeia i)) amp 0xff (crc gtgt 8) amp return sprintf (formato crc) A função crc32 () pode retornar um inteiro assinado em determinados ambientes. Supondo que ele sempre retornará um inteiro não assinado não é portátil. Dependendo do seu comportamento desejado, você provavelmente deve usar sprintf () no resultado ou o hash genérico () em vez disso. Observe também que os operadores aritméticos inteiros não têm a precisão para trabalhar corretamente com a saída inteira. / Define (POLY64REV, 95AC9329AC4BC9B5) // define (INITIALCRC, FFFFFFFFFFFFFFFF) if (functionexists (gmpinit)) classe CRC64 private Se (init) init TRUE para (i 0 i lt TABLELEN i) parte gmpinit (i. l0) init FALSE pol64rev gmpinit (POLY64REV. Para (j 0 j lt 8 j) se (gmptr (gmpand (parte 0x1)) 0) // if (gmptestbit (parte, 1)) parte gmpxor (gmpdivq (parte 2), poly64rev) 2) self. CRCTable i parte para (k 0 k lt strlen (seq) k) tmpgmpval gmpinit (ord (seq k), 10) índice de tabela gmpxor (gmpand (crc 0xff), tmpgmpval) crc gmpdivq (crc 256) crc gmpxor (crc. (Por favor, instale o pacote php-gmp.) Gt Observe que o algoritmo CRC32 não deve ser usado para fins criptográficos ou em situações em que um objeto hostil / Untrusted usuário está envolvido, pois é muito fácil gerar uma colisão de hash para CRC32 (duas seqüências binárias diferentes que têm o mesmo hash CRC32). Considere SHA-1 ou MD5. Eu precisava do crc32 de um arquivo que era muito grande, então eu não queria lê-lo na memória. Então eu fiz isso: ltphp GLOBALS crc32table array () // Tabela de tabela de pesquisa crc32inittable () function crc32inittable () // Este é o polinômio oficial usado por // CRC-32 em PKZip, WinZip e Ethernet. Polinômio 0x04c11db7 // 256 valores representando códigos de caractere ASCII. Para (i 0 i lt 0xFF i) GLOBALS crc32table i (crc32reflect (i.8) ltlt 24) para (j 0 j lt 8 j) GLOBALS crc32table i ((GLOBALS crc32table i ltlt 1) ((GLOBALS crc32table i amp Ltlt 31)) polinomial 0)) GLOBALS crc32table i crc32reflect (GLOBALS crc32table i, 32) // Troca de bit 0 para bit 7, bit 1 de bit 6, etc para (i 1 i lt (ch 1) i) if (Ref amp 1) valor (1 ltlt (ch - i)) ref ((ref gtgt 1) amp 0x7fffffff) função de valor de retorno crc32string (texto) // Uma vez que a tabela de pesquisa foi preenchida pelas duas funções acima, // Esta função cria todos os CRCs utilizando apenas a tabela de pesquisa. // Você precisa de variáveis ​​não assinadas porque os valores negativos // introduzem bits altos onde zero bits são necessários. // PHP não tem unsigned integers: // Ive resolveu este problema fazendo um amp após um gtgt. // Comece com todos os bits definidos em alta. Crc 0xffffffff len strlen (text) // Execute o algoritmo em cada caractere da string, // usando os valores da tabela de pesquisa. Para (i 0 i lt len ​​i) crc ((crc gtgt 8) amp 0x00ffffff) GLOBALS crc32table (crc amp 0xFF) ord (texto) // Exclusivo OU o resultado com o valor inicial. Return crc 0xffffffff função crc32file (name) // Info: olhar para crc32string // Comece com todos os bits set high. Crc 0xffffffff if ((fp fopen (nome. rb)) false) return false // Executa o algoritmo em cada caractere no arquivo para () i fread (fp.1) se (strlen (i) 0) Gtgt 8) amp 0x00ffffff) GLOBALS crc32table (crc amp 0xFF) ord (i) // Exclusivo OU o resultado com o valor inicial. Return crc 0xffffffff gt Eu fiz este código para verificar Transmition com Vantage Pro2 (estação meteorológica) baseado no CRC16-CCITT padrão. ltphp // CRC16-CCITT validador matriz crctable (0x0. 0x1021. 0x2042. 0x3063. 0x4084. 0x50a5. 0x60c6. 0x70e7, 0x8108. 0x9129. 0xa14a. 0xb16b. 0xc18c. 0xd1ad. 0xe1ce. 0xf1ef, 0x1231. 0x210. 0x3273. 0x2252. 0x52b5. 0x4294. 0x72f7. 0x62d6, 0x9339. 0x8318. 0xb37b. 0xa35a. 0xd3bd. 0xc39c. 0xf3ff. 0xe3de, 0x2462. 0x3443. 0x420. 0x1401. 0x64e6. 0x74c7. 0x44a4. 0x5485, 0xa56a. 0xb54b. 0x8528. 0x9509. 0xe5ee. 0xf5cf. 0xc5ac. 0xd58d, 0x3653. 0x2672. 0x1611. 0x630. 0x76d7. 0x66f6. 0x5695. 0x46b4, 0xb75b. 0xa77a. 0x9719. 0x8738. 0xf7df. 0xe7fe. 0xd79d. 0xc7bc, 0x48c4. 0x58e5. 0x6886. 0x78a7. 0x840. 0x1861. 0x2802. 0x3823, 0xc9cc. 0xd9ed. 0xe98e. 0xf9af. 0x8948. 0x9969. 0xa90a. 0xb92b, 0x5af5. 0x4ad4. 0x7ab7. 0x6a96. 0x1a71. 0xa50. 0x3a33. 0x2a12, 0xdbfd. 0xcbdc. 0xfbbf. 0xeb9e. 0x9b79. 0x8b58. 0xbb3b. 0xb1a, 0x6ca6 0x7c87 0x4c4 0x5cc5 0x2c22 0x3c03 0xc60 0x1c41 0xce 0xfd8f 0xcdec 0xddcd 0xad2a 0xbd0b 0x8d68 0x9d49 0x7e97 0x6eb6 0x5ed5 0x4ef4 0x3e13 0x2e32 0x1e51. 0xe70, 0xff9f. 0xefbe. 0xdfdd. 0xcffc. 0xbf1b. 0xaf3a. 0x9f59. 0x8f78, 0x9188. 0x81a9. 0xb1ca. 0xa1eb. 0xd10c. 0xc12d. 0xf14e. 0xe16f, 0x1080. 0xa1. 0x30c2. 0x20e3. 0x5004. 0x4025. 0x7046. 0x6067, 0x83b9. 0x9398. 0xa3fb. 0 x b3da. 0xc33d. 0xd31c. 0xe37f. 0xf35e, 0x2b1. 0x1290. 0x22f3. 0x32d2. 0x4235. 0x5214. 0x6277. 0x7256, 0xb5ea. 0xa5cb. 0x95a8. 0x8589. 0xf56e. 0xe54f. 0xd52c. 0xc50d, 0x34e2. 0x24c3. 0x14a0. 0x481. 0x7466. 0 x 6 447. 0x5424. 0x4405, 0xa7db. 0xb7fa. 0x8799. 0x97b8. 0xe75f. 0xf77e. 0xc71d. 0xd73c, 0x26d3. 0x36f2. 0x691. 0x16b0. 0x6657. 0x7676. 0x4615. 0x5634, 0xd94c. 0xc96d. 0xf90e. 0xe92f. 0x99c8. 0x89e9. 0xb98a. 0xa9ab, 0x5844. 0x4865. 0x7806. 0x6827. 0x18c0. 0x8e1. 0x3882. 0x28a3, 0xcb7d. 0xdb5c. 0xeb3f. 0xfb1e. 0x8bf9. 0x9bd8. 0xabbb. 0xbb9a, 0x4a75. 0x5a54. 0x6a37. 0x7a16. 0 xaf1. 0x1ad0. 0x2ab3. 0x3a92, 0xfd2e. 0xed0f. 0xdd6c. 0xcd4d. 0xbdaa. 0xad8b. 0x9de8. 0x8dc9, 0x7c26. 0x6c07. 0x5c64. 0x4c45. 0x3ca2. 0x2c83. 0x1ce0. 0xcc1, 0xef1f. 0xff3e. 0xcf5d. 0xdf7c. 0xaf9b. 0xbfba. 0x8fd9. 0x9ff8, 0x6e17. 0x7e36. 0x4e55. 0x5e74. 0x2e93. 0x3eb2. 0xed1. 0x1ef0) teste chr (0xC6). Chr (0xCE). Chr (0xA2). Chr (0x03) // CRC16-CCITT 0xE2B4 função genCRC (teste) genCRC (amp ptr) crc 0x0000 crctable GLOBALS crctable para (i 0 i lt strlen (ptr) i) crc crctable (crc gtgt 8) ord (ptr i) (Crc ltlt 8) amp 0x00FFFF) return crc gt A função crc32combine () fornecida por petteri em qred dot fi tem um bug que causa um loop infinito, uma operação de troca em um 32-bit assinado int nunca pode chegar a zero. Substituindo a função gf2matrixtimes () com o seguinte parece corrigi-lo: ltphp função gf2matrixtimes (mat. Vec) soma 0 i 0 enquanto (vec) se (vec amp 1) soma mat i vec (vec gtgt 1) amp 0x7FFFFFFF i return sum Gt Caso contrário, é provavelmente a melhor solução se você não pode usar hashfile (). Usando um buffer de leitura de 1 meg, a função só leva duas vezes mais tempo para processar arquivos de 300meg do que hashfile () no meu teste. Se você estiver procurando uma função rápida para hash um arquivo, dê uma olhada em php. net/manual/en/function. hash-file. php este é crc32 verificador de arquivos com base em um guia CRC32 tem desempenho em 625 KB / s No meu 2.2GHz Turion muito mais lento do que hashfile (crc32b, filename. ext) função ltphp crc32file (nome de arquivo) f fopen (nome de arquivo. Rb) if (f) return false static CRC32Table. Reflect8Table if (isset (CRC32Table)) Polinômio 0x04c11db7 topBit 1 ltlt 31 para (i 0 i lt 256 i) restante i ltlt 24 para (j 0 j lt 8 j) se (restante amp amp) resto (restante ltlt 1) Polynomial else Restante restante ltlt 1 CRC32Table i restante if (isset (Reflect8Table i)) continue str strpad (decbin (i), 8. 0. STRPADLEFT) num bindec (strrev (str)) Reflect8Table i num Reflect8Table num i restante 0xffffffff enquanto (dados fread (F 1024)) len strlen (dados) para (i 0 i lt len) byte Reflect8Table ord (dados i) índice ((restante gtgt 24) amp 0xff) byte crc CRC32Table índice restante (restante ltlt 8) crc str decbin (Restante) str strpad (str 32. STRPADLEFT) restante bindec (strrev (str)) retorna o restante 0xffffffff gt ltphp um microtime () echo dechex (crc32file (filename. ext)). N b microtime () echo arraysum (explodir (.b)) - arraysum (explodir (a)). N gt Saída: ec7369fe 2.384134054184 (ou semelhante) Eu usei o valor abs desta função em um sistema de 32 bits. Quando portar o código para um sistema de 64 bits, descobri que o valor é diferente. O código a seguir tem o mesmo resultado em ambos os sistemas. / Crc abs (crc32 (string)) / Leitor ter cuidado: este post faz parte da era Objective-C mais antiga no Cocoa with Love. (Crc32 (string)) if (crc 0x80000000) crc 0xffffffff crc 1 / Eu não manter estes artigos up-to-date para que o código pode ser quebrado ou substituído por APIs mais recentes. Há algumas boas informações, mas há também algumas opiniões que eu não mais endossar manter uma mente céptica. Leia Uma nova era para o Cacau com Amor para mais. Opções de codificação Base64 no Mac e no iPhone Em plataformas Unix, uma abordagem comum para a codificação Base64 é usar libcrypto (a biblioteca OpenSSL). No entanto, como a maioria das bibliotecas C, você precisa envolvê-lo para integrar com os tipos de dados Objective-C (como NSData e NSString) e não está disponível no iPhone. Ill mostrar-lhe como lidar com base64 codificação / decodificação com OpenSSL e sem que você possa lidar com o Mac e iPhone igualmente. Introduction Base64 is an encoding for transferring binary data in 7-bit text. Originally used in email. it is also used for binary encoding data in HTML files. Another common use for Base64 is in HTTP Basic Access Authentication where it is used to transfer login details (which might not be printable characters). The key library for handling Base64 on the Mac is normally libcrypto (the OpenSSL library), so its a little disappointing that libcrypto isnt available on the iPhone. Using OpenSSL Via the command line On the Mac, you can handle simple encoding tasks like base64 encoding with OpenSSL on the command line: gives the encoding result:

Comments