1 (изменено: Serge Yolkin, 2013-02-14 22:52:22)

Тема: HTA: Вычисление CRC32 строки или файла (обсуждение)

Коллекция скриптов и идей пишет:

HTA: вычисление CRC32 строки или файла



mozers, прошу прощения, если вопрос глупый, но чем отличается

vbASCII(str.charAt(i))

от

str.charCodeAt(i)

?

Вот же ж. Оказывается, проблема с некоторыми юникодными символами. Текстовый файл разбирается нормально, даже с кириллицей (не уверен, что любой), а вот байты 0x80 - 0x9f возвращаются настолько забавно, что я даже закономерности не понял.

2

Re: HTA: Вычисление CRC32 строки или файла (обсуждение)

Всё же сделал, что хотел. Правда, замену некоторых символов юникодными пришлось побеждать тупой табличной заменой (благо их не так много)

var
 t1=new Date(),
 t2;

var
 c={338:140,339:156,352:138,353:154,376:159,381:142,382:158,402:131,710:136,732:152,
  8211:150,8212:151,8216:145,8217:146,8218:130,8220:147,8221:148,8222:132,8224:134,
  8225:135,8226:149,8230:133,8240:137,8249:139,8250:155,8364:128,8482:153},    // UTF>ANSI
 n='G:\\Case\\BookPages.zip',    // [путь\\]имя файла
 r=0xFFFFFFFF,            // здесь будет результат
 s,
 t=[];                // здесь будут табличные значения для алгоритма CRC

for(var i=0;i<256;i++){        // вычисляем табличные значения для алгоритма CRC
  s=i;
  for(var j=0;j<8;j++)s=(s&1)?0xEDB88320^(s>>>1):s>>>1;
  t[i]=s;
}

try{                // пытаемся читать файл
  with(new ActiveXObject("ADODB.Stream")){
    type=2,charset='ISO-8859-1';
    open(),loadFromFile(n);
    s=readText();
    close();
  }
}catch(e){
  WScript.echo('Не удалось получить файл\n'+n);
  WScript.quit();
}

for(var i=0;i<s.length;i++)    // собственно, вычисляем контрольную сумму
 r=t[(r^(s.charCodeAt(i)<256?s.charCodeAt(i):c[s.charCodeAt(i)]))&0xFF]^(r>>>8);

r=r^0xFFFFFFFF;
if(r<0)r+=4294967296;

t2=new Date();
t1=t2-t1;

WScript.echo(r.toString(16)+'\n'+t1+' mS');

3 (изменено: mozers, 2013-05-16 20:40:11)

Re: HTA: Вычисление CRC32 строки или файла (обсуждение)

2Serge Yolkin
1) На свой вопрос "в чем разница?" ты сам уже ответил. (Просто charCodeAt работает с уникодом, а Asc - с ASCII).
Алгоритм на чистом js получается настолько замороченный, что даже я, большой его почитатель, решил отказаться.

2) Ниже моего поста в Коллекции написано

Последняя версия находится тут

Не зря так написано. Изменений - полно.
Моя б воля - я бы верхний пост, с этой первой и не совсем удачной попыткой, давно бы стер. Чтобы он добрых людей с панталыги не сбивал.
alexii может сотрешь?

4

Re: HTA: Вычисление CRC32 строки или файла (обсуждение)

Serge Yolkin

var b=new ActiveXObject("Microsoft.XMLDOM").createElement("binObj"); b.dataType='bin.hex';
var
 t1=new Date(),
 t2;

var
/* c={338:140,339:156,352:138,353:154,376:159,381:142,382:158,402:131,710:136,732:152,
  8211:150,8212:151,8216:145,8217:146,8218:130,8220:147,8221:148,8222:132,8224:134,
  8225:135,8226:149,8230:133,8240:137,8249:139,8250:155,8364:128,8482:153},    // UTF>ANSI*/
 n='G:\\Case\\BookPages.zip',    // [путь\\]имя файла
 r=0xFFFFFFFF,            // здесь будет результат
 s,
 t=[];                // здесь будут табличные значения для алгоритма CRC

for(var i=0;i<256;i++){        // вычисляем табличные значения для алгоритма CRC
  s=i;
  for(var j=0;j<8;j++)s=(s&1)?0xEDB88320^(s>>>1):s>>>1;
  t[i]=s;
}

try{                // пытаемся читать файл
  with(new ActiveXObject("ADODB.Stream")){
//    type=2,charset='ISO-8859-1';
    type=1;
    open(),loadFromFile(n);
//    s=readText();
    b.nodeTypedValue=read();
    s=b.text;
    close();
  }
}catch(e){
  WScript.echo('Не удалось получить файл\n'+n);
  WScript.quit();
}

/*for(var i=0;i<s.length;i++)    // собственно, вычисляем контрольную сумму
 r=t[(r^(s.charCodeAt(i)<256?s.charCodeAt(i):c[s.charCodeAt(i)]))&0xFF]^(r>>>8);*/
for(var i=0;i<s.length;i+=2)    // собственно, вычисляем контрольную сумму
 r=t[(r^('0x'+s.substr(i,2)))&0xFF]^(r>>>8);

r=r^0xFFFFFFFF;
if(r<0)r+=4294967296;

t2=new Date();
t1=t2-t1;

WScript.echo(r.toString(16)+'\n'+t1+' mS');
Я конечно далек от мысли... (с)

5

Re: HTA: Вычисление CRC32 строки или файла (обсуждение)

mozers пишет:

Моя б воля - я бы верхний пост, с этой первой и не совсем удачной попыткой, давно бы стер. Чтобы он добрых людей с панталыги не сбивал.

alexii может сотрешь?

Особенность движка в том, что при удалении первого поста удаляется вся тема.

Можем сделать так: я перенесу содержимое второго поста в первый, первой же строкой, с указанием обязательного посещения ссылки для получения последней версии. Устроит?

6

Re: HTA: Вычисление CRC32 строки или файла (обсуждение)

2alexii
Конечно так будет лучше.
Можно еще добавить ссылку на историю версий. И упомянуть о возможности получения из репозитария любой версии (с начальной до конечной).

7

Re: HTA: Вычисление CRC32 строки или файла (обсуждение)

smaharbA, предложенное Вами изменение повысило быстродействие почти вдвое. Снимаю шляпу. Про элемент binObj не знал. Нет, теперь уже нашёл и почитал, а до этого просто не знал.

mozers, я совсем не знаю бейсика, но визуально сам алгоритм вычисления CRC32 в последней версии мало отличается от более ранних. Поправьте меня, если это не так. Я использовал то, что было переведено на JScript.