2015-04-02 6 views
5

İstemci tarafında (Javascript) Bir tarayıcıdan yerel bir dosyayı okumak için FileReader() Nesnesini kullanıyorum ve bu dosya XMLHttpRequest() nesnesi sayesinde sunucuya (PHP) gönderilir. FileReader nesnesi sayesinde kurtardığım nesne bir arrayBuffer'tır. Bu ArrayBuffer nesnesi, bir genel, sabit uzunlukta ham ikili veri arabelleğini temsil etmek için kullanılır ve içeriği doğrudan manipüle edilemez. Aktarımı en iyi duruma getirmek için dosyayı birkaç yığın halinde bölüyorum. Aktarılan her bir parçanın bütünlüğünü kontrol etmek istiyorum (Her bir parça yaklaşık 100KB'dir). Buradaki fikir, CRC'yi javascript tarafında ve sunucu tarafında hesaplamak, ardından bütünlüğü kontrol etmek için iki CRC'yi karşılaştırmak ve gerekirse aktarımı yeniden denemek.Bir diziBuffer'ın CRC'sini (javascript'ten FileReader'dan) php'de CRC32 işleviyle uyumlu olarak nasıl hesaplanır?

JAVASCRIPT bazı araştırmadan sonra

var fileReader = new FileReader(); 
fileReader.onload = function(event){ 

    var arrayBuffer = event.target.result; 
    // 
    // TODO : calculate the crc of this arrayBuffer 

    var xhr = new XMLHttpRequest(); 
    ... 
    xhr.open(YourMethod,YourUrl,true); 
    ... 
    xhr.addEventListener('loadend', function (event) { 

    var CRCFromPhp = event.target.responseText; 

    // TODO : compare the CRC from php with the CRC from javascript 

    } 


} 
fileReader.readAsArrayBuffer(blob); 

PHP

$file_crc = hash_file("crc32b",$target_file,FALSE); 
    $file_crc = sprintf('%u',hexdec($file_crc)); 
    echo $file_crc; 

cevap

2

Kendimi cevap bulmak ve burada aynı sorunla tüm insanlar için benim çözüm sonrası. Aşağıdaki çözüm bulduğum en hızlı çözüm.

Her şeyden önce, DataStream.js kitaplığını indirmeniz gerekir. https://github.com/kig/DataStream.js/blob/master/DataStream.js

DataView nesnesini kullanan bir çözüm gördüm, ancak çok yavaştı (bir 100 KB dosyası için 150ms). DataStream nesnesini kullanarak aynı dosya için + - 5ms gerekir. Bir Sha1 ile yaklaşık 350ms'dir.

crc32FromArrayBuffer:function(ab){ 

     var table = new Uint32Array([ 
      0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 
      0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 
      0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 
      0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 
      0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 
      0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 
      0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 
      0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 
      0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 
      0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 
      0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 
      0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 
      0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 
      0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 
      0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 
      0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 
      0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 
      0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 
      0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 
      0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 
      0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 
      0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 
      0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 
      0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 
      0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 
      0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 
      0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 
      0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 
      0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 
      0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 
      0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 
      0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 
      0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 
      0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 
      0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 
      0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 
      0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 
      0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 
      0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 
      0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 
      0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 
      0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 
      0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d 
     ]); 


     var ds = new DataStream(ab); 

     var crc = 0^(-1); 

     var dsArr = ds.readUint8Array(); 
     for(var i = 0; i < ab.byteLength; i++){ 

      crc = (crc >>> 8)^table[(crc^dsArr[i]) & 0xFF]; 
     } 

     return (crc^(-1)) >>> 0; 

    } 
+1

ben yerine '(yeni DataStream (ab)) arasında' sadece 'yeni Uint8Array (ab) kullanabiliriz. ReadUint8Array()' (DataStream.js gerekli değildir), bir ** bayt beri * * Endianness umurumda değil dizisi. –

İlgili konular