:: Не фоксом единым
JavaScript CRC32
NOVLAN
Автор

Сообщений: 103
Откуда: Харьков
Дата регистрации: 16.11.2005
Подскажите пожалуйста, как мне изменить функцию crc32, чтобы ее результат всегда совпадал с SYS(2007, cExpression, 0, 1).

P.S. SYS(2007) всегда возвращает положительный результат, javascript - нет

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>CRC32 JavaScript</title>
</head>
<body>
<script type="text/javascript">
function utf8_encode (string) {
string = string.replace(/\r\n/g,"\n");
var utftext = "";
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if( c < 128 ){
utftext += String.fromCharCode(c);
}else if( (c > 127) && (c < 2048) ){
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
} else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
}
function crc32 (sourcestr) {
sourcestr = utf8_encode (sourcestr);
var crc32table = "00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F ";
crc32table += "E963A535 9E6495A3 0EDB8832 79DCB8A4 E0D5E91E 97D2D988 ";
crc32table += "09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 ";
crc32table += "F3B97148 84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 ";
crc32table += "136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F 63066CD9 ";
crc32table += "FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 ";
crc32table += "3C03E4D1 4B04D447 D20D85FD A50AB56B 35B5A8FA 42B2986C ";
crc32table += "DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 ";
crc32table += "26D930AC 51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 ";
crc32table += "CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 B10BE924 ";
crc32table += "2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 ";
crc32table += "98D220BC EFD5102A 71B18589 06B6B51F 9FBFE4A5 E8B8D433 ";
crc32table += "7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D ";
crc32table += "91646C97 E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E ";
crc32table += "6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 12B7E950 ";
crc32table += "8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 ";
crc32table += "4DB26158 3AB551CE A3BC0074 D4BB30E2 4ADFA541 3DD895D7 ";
crc32table += "A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 ";
crc32table += "44042D73 33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA ";
crc32table += "BE0B1010 C90C2086 5768B525 206F85B3 B966D409 CE61E49F ";
crc32table += "5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 ";
crc32table += "B7BD5C3B C0BA6CAD EDB88320 9ABFB3B6 03B6E20C 74B1D29A ";
crc32table += "EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 ";
crc32table += "0D6D6A3E 7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 ";
crc32table += "F00F9344 8708A3D2 1E01F268 6906C2FE F762575D 806567CB ";
crc32table += "196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC ";
crc32table += "F9B9DF6F 8EBEEFF9 17B7BE43 60B08ED5 D6D6A3E8 A1D1937E ";
crc32table += "38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B ";
crc32table += "D80D2BDA AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 ";
crc32table += "316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 5268E236 ";
crc32table += "CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 ";
crc32table += "2BB45A92 5CB36A04 C2D7FFA7 B5D0CF31 2CD99E8B 5BDEAE1D ";
crc32table += "9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F ";
crc32table += "72076785 05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 ";
crc32table += "92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 F1D4E242 ";
crc32table += "68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 ";
crc32table += "88085AE6 FF0F6A70 66063BCA 11010B5C 8F659EFF F862AE69 ";
crc32table += "616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 ";
crc32table += "A7672661 D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC ";
crc32table += "40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F 30B5FFE9 ";
crc32table += "BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 ";
crc32table += "54DE5729 23D967BF B3667A2E C4614AB8 5D681B02 2A6F2B94 ";
crc32table += "B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D";
var crc = 0;
var x = 0;
var y = 0;
crc = crc ^ (-1);
for( var i = 0, iTop = sourcestr.length; i < iTop; i++ ) {
y = ( crc ^ sourcestr.charCodeAt( i ) ) & 0xFF;
x = "0x" + crc32table.substr( y * 9, 8 );
crc = ( crc >>> 8 ) ^ x;
}
return crc ^ (-1);
}
</script>
<form>
String:&nbsp;<input name="stroke" type="text" value="Visual FoxPro"><br/>
Result:&nbsp;<input name="result" type="text"><br/>
<input name="generate" type="button" value="Generate" onclick="document.forms[0].result.value = crc32(document.forms[0].stroke.value);">
</form>
</body>
</html>
Ratings: 0 negative/0 positive
Re: JavaScript CRC32
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Банально +2^32 для отрицательных сделать
Бинарно это те же самые байтики, просто разная визуализация/трактовка - как число со знаком или число без знака.
Для перевода signed в unsigned в JS гугл советует такой манёвр
return new Uint32Array([crc ^ (-1)])
p.S. Ну и да, фокс возвращает это число в виде строки из SYS(2007)...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: JavaScript CRC32
NOVLAN
Автор

Сообщений: 103
Откуда: Харьков
Дата регистрации: 16.11.2005
Только ABS() убрать знак не поможет, т.к.:

javascript: crc32('Visual FoxPro') = -1477356667
vfp: SYS(2007,'Visual FoxPro',0,1) = 2817610629

результаты сами по себе сильно разнятся, хотя

javascript: crc32('Visual FoxPro forever!') = 2028538741
vfp: SYS(2007,'Visual FoxPro forever!',0,1) = 2028538741

Что изменить в javascript-коде, чтобы результаты совпадали всегда?



Исправлено 1 раз(а). Последнее : NOVLAN, 05.06.17 17:57
Ratings: 0 negative/0 positive
Re: JavaScript CRC32
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Где ты прочитал про "убрать знак"?

? -1477356667 + 2^32 = 2817610629

Что непонятно в коде
return new Uint32Array([crc ^ (-1)])
который решает твою "проблему"?


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: JavaScript CRC32
NOVLAN
Автор

Сообщений: 103
Откуда: Харьков
Дата регистрации: 16.11.2005
Igor Korolyov
Где ты прочитал про "убрать знак"?

У себя в коде (т.е. в своих результатах): побрел не в ту степь... :-[

Igor Korolyov
? -1477356667 + 2^32 = 2817610629

Что непонятно в коде
return new Uint32Array([crc ^ (-1)])
который решает твою "проблему"?

Кажись разобрался. Теперь все понятно. Спасибо огромное.

P.S. Результаты вообще всегда-всегда будут совпадать, если в фоксе строку конвертировать в UTF-8 thumbs down

javascript: crc32('Лисоводы всех стран, объединяйтесь !') = 3733843477
vfp: SYS(2007,STRC('Лисоводы всех стран, объединяйтесь !',9),0,1) = 3733843477
Ratings: 0 negative/0 positive
Re: JavaScript CRC32
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Ну если внимательно смотреть на первую строку JS метода, то это должно быть очевидно...
sourcestr = utf8_encode(sourcestr);


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: JavaScript CRC32
NOVLAN
Автор

Сообщений: 103
Откуда: Харьков
Дата регистрации: 16.11.2005
Угу
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 10 (Гостей: 10)

© 2000-2024 Fox Club 
Яндекс.Метрика