D2S/Item parser in progress. Still need to debug cubemain.txt doc generator output colulmns. Saving code for now

This commit is contained in:
Hash Borgir
2022-06-20 19:27:08 -06:00
parent 521dfe12c6
commit 822e3dcbd8
19 changed files with 482 additions and 1242 deletions
+81 -108
View File
@@ -7,130 +7,103 @@ ini_set('max_execution_time', '0');
session_start(); session_start();
ob_start(); ob_start();
echo "<pre>"; require_once './config.php';
require_once './_pdo.php';
require_once './src/D2Functions.php';
require_once './src/D2BitReader.php';
//require_once './src/D2Item.php';
define('DB_FILE', $_SESSION['modname'] . ".db");
PDO_Connect("sqlite:" . DB_FILE);
$sql = "SELECT * FROM strings";
$strings = PDO_FetchAssoc($sql);
$sql = "SELECT code,namestr
FROM armor
UNION SELECT code,namestr
FROM misc
UNION SELECT code,namestr
FROM weapons
";
$namestr = PDO_FetchAssoc($sql);
//ddump($namestr);
//$filePath = "D:\Diablo II\MODS\ironman-dev\save\Aldur.d2s";
$filePath = "D:\Diablo II\MODS\ironman-dev\save\Sorc.d2s"; $filePath = "D:\Diablo II\MODS\ironman-dev\save\Sorc.d2s";
$fp = fopen($filePath, "rb"); //$filePath = "D:\Diablo II\MODS\MedianXL2012\save\Lok.d2s";
//$filePath = "D:\Diablo II\MODS\MedianXL2012\save\Pal.d2s";
$fp = fopen($filePath, 'r+b');
$data = file_get_contents($filePath);
$i_offset = strpos($data, "JM");
function strtobits(string $str): string { fseek($fp, $i_offset + 2);
$ret = ""; $i_total = unpack('S*', (fread($fp, 2)))[1];
for ($i = 0; $i < strlen($str); ++$i) {
$ord = ord($str[$i]); $items = null;
for ($bitnum = 7; $bitnum >= 0; --$bitnum) {
if ($ord & (1 << $bitnum)) { $offset = $i_offset + 4; // JM00
$ret .= "1";
} else { $first_item_offset = strposX($data, "JM", 2);
$ret .= "0"; $second_item_offset = strposX($data, "JM", 3);
}
} $item_size = $second_item_offset - $first_item_offset;
for ($i = 2; $i <= $i_total; $i++) {
fseek($fp, strposX($data, 'JM', $i));
$_items[] = unpack('C*', fread($fp, 21));
}
foreach ($_items as $_item) {
$item = null;
foreach ($_item as $i_bytes) {
$item .= strrev(str_pad(decbin($i_bytes), 8, 0, STR_PAD_LEFT));
// $item .= (str_pad(dechex($i_bytes), 2, 0, STR_PAD_LEFT));
} }
return $ret; $items[] = $item;
} }
foreach ($qNorm as $k => $v) { // ddump($items);
fseek($fp, $k);
$questsNorm[$k] = fread($fp, 2);
}
foreach ($qNM as $k => $v) { foreach ($items as $_item) {
fseek($fp, $k);
$questsNM[$k] = fread($fp, 2);
}
foreach ($qHell as $k => $v) { // dump($_item[19]);
fseek($fp, $k); // dump($_item);
$questsHell[$k] = fread($fp, 2); // dump(strtoupper(implode(" ", str_split($_item, 8))));
} // dump((($_item[36])));
foreach ($offsets as $k => $v) { $b = new D2BitReader($_item);
fseek($fp, $k);
$data[$k] = fread($fp, $v); //$b->bseek(27);
} //dump($b->bread(1));
$b->seek(76);
// dump($b->bread(32));
$codeBits = str_split($b->read(32), 8);
$charData['Identifier'] = bin2hex($data[0]); $itemCode = '';
foreach ($codeBits as $byte) {
$charData['VersionID'] = unpack('l', $data[4])[1]; // 96 is v1.10+ - check out // dump(strrev($byte));
//dump(sprintf('%c', bindec($byte)));
$charData['Filesize'] = round(unpack('l', $data[8])[1] / 1024, 2) . " KB"; // 1.41 KB (1,447 bytes) - checks out $itemCode .= chr(bindec(strrev($byte)));
// $charData['Checksum'] = bin2hex($data['12']);
// $charData['Activeweapon'] = unpack('l', $data['16']);
$charData['CharacterName'] = ($data[20]);
// $charData['CharacterStatus'] = array_filter(str_split(strtobits($data[36])));
foreach ($charData['CharacterStatus'] as $k => $v) {
$str .= ($characterStatus[$k]) . " ";
}
$charData['CharacterStatus'] = $str;
// $charData['Characterprogression'] = bindec($data['37']);
$charData['CharacterClass'] = $class[unpack('C', $data[40])[1]];
$charData['CharacterLevel'] = unpack('C', $data[43])[1];
$charData['Lastplayed'] = gmdate("Y-m-d\TH:i:s\Z", unpack('I', $data[48])[0]);
// $charData['Assignedskills'] = (unpack('i16', $data['56']));
$charData['LeftmousebuttonskillID'] = $skills[unpack('i', $data[120])[1]];
$charData['RightmousebuttonskillID'] = $skills[unpack('i', $data[124])[1]];
$charData['LeftswapmousebuttonskillID'] = $skills[unpack('i', $data[128])[1]];
$charData['RightswapmousebuttonskillID'] = $skills[unpack('i', $data[132])[1]];
// $charData['Charactermenuappearance'] = unpack('i', $data[136]);
$x = str_split(strtobits($data[168]), 8);
$onDifficulty['Norm'] = $x[0][0];
$onDifficulty['NM'] = $x[1][0];
$onDifficulty['Hell'] = $x[2][0];
$charData['Difficulty'] = array_filter($onDifficulty);
//$charData['MapID'] = $data['171'];
//$charData['Mercenarydead'] = unpack('i', $data['177']);
//$charData['MercenaryID'] = $data['179'];
//$charData['MercenaryNameID'] = $data['183'];
//$charData['Mercenarytype'] = $data['185'];
//$charData['Mercenaryexperience'] = $data['187'];
foreach ($questsNorm as $k => $v) {
$x = array_filter(str_split(strtobits($v), 8));
if ($x[0][0]) {
$quests[] = ($qNorm[$k] . " => " . (($x[0][0])) . "<br>");
}
}
foreach ($questsNM as $k => $v) {
$x = array_filter(str_split(strtobits($v), 8));
if ($x[0][0]) {
$quests[] = ($qNM[$k] . " => " . (($x[0][0])) . "<br>");
}
}
foreach ($questsHell as $k => $v) {
$x = array_filter(str_split(strtobits($v), 8));
if ($x[0][0]) {
$quests[] = ($qHell[$k] . " => " . (($x[0][0])) . "<br>");
} }
$itemCode = trim($itemCode);
dump($namestr[$itemCode]);
dump($strings[$namestr[$itemCode]]);
// dump($strings[trim($itemCode)]);
} }
$charData['Quests'] = $quests;
$charData['Waypoints'] = $data[633];
$charData['NPCIntroductions'] = $data[714];
print_r($charData);
// $charData['Unknown'] = $data['44'];
// $charData['Unknown'] = $data['52'];
// $charData['Unknown'] = $data['175'];
// $charData['Unknown'] = $data['191'];
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
+6 -306
View File
@@ -1,314 +1,14 @@
<?php <?php
$xorTableHex = [
"00" => 0x0,
"01" => 0x77073096,
"02" => 0xEE0E612C,
"03" => 0x990951BA,
"04" => 0x076DC419,
"05" => 0x706AF48F,
"06" => 0xE963A535,
"07" => 0x9E6495A3,
"08" => 0x0EDB8832,
"09" => 0x79DCB8A4,
"0A" => 0xE0D5E91E,
"0B" => 0x97D2D988,
"0C" => 0x09B64C2B,
"0D" => 0x7EB17CBD,
"0E" => 0xE7B82D07,
"0F" => 0x90BF1D91,
"10" => 0x1DB71064,
"11" => 0x6AB020F2,
"12" => 0xF3B97148,
"13" => 0x84BE41DE,
"14" => 0x1ADAD47D,
"15" => 0x6DDDE4EB,
"16" => 0xF4D4B551,
"17" => 0x83D385C7,
"18" => 0x136C9856,
"19" => 0x646BA8C0,
"1A" => 0xFD62F97A,
"1B" => 0x8A65C9EC,
"1C" => 0x14015C4F,
"1D" => 0x63066CD9,
"1E" => 0xFA0F3D63,
"1F" => 0x8D080DF5,
"20" => 0x3B6E20C8,
"21" => 0x4C69105E,
"22" => 0xD56041E4,
"23" => 0xA2677172,
"24" => 0x3C03E4D1,
"25" => 0x4B04D447,
"26" => 0xD20D85FD,
"27" => 0xA50AB56B,
"28" => 0x35B5A8FA,
"29" => 0x42B2986C,
"2A" => 0xDBBBC9D6,
"2B" => 0xACBCF940,
"2C" => 0x32D86CE3,
"2D" => 0x45DF5C75,
"2E" => 0xDCD60DCF,
"2F" => 0xABD13D59,
"30" => 0x26D930AC,
"31" => 0x51DE003A,
"32" => 0xC8D75180,
"33" => 0xBFD06116,
"34" => 0x21B4F4B5,
"35" => 0x56B3C423,
"36" => 0xCFBA9599,
"37" => 0xB8BDA50F,
"38" => 0x2802B89E,
"39" => 0x5F058808,
"3A" => 0xC60CD9B2,
"3B" => 0xB10BE924,
"3C" => 0x2F6F7C87,
"3D" => 0x58684C11,
"3E" => 0xC1611DAB,
"3F" => 0xB6662D3D,
"40" => 0x76DC4190,
"41" => 0x01DB7106,
"42" => 0x98D220BC,
"43" => 0xEFD5102A,
"44" => 0x71B18589,
"45" => 0x06B6B51F,
"46" => 0x9FBFE4A5,
"47" => 0xE8B8D433,
"48" => 0x7807C9A2,
"49" => 0x0F00F934,
"4A" => 0x9609A88E,
"4B" => 0xE10E9818,
"4C" => 0x7F6A0DBB,
"4D" => 0x086D3D2D,
"4E" => 0x91646C97,
"4F" => 0xE6635C01,
"50" => 0x6B6B51F4,
"51" => 0x1C6C6162,
"52" => 0x856530D8,
"53" => 0xF262004E,
"54" => 0x6C0695ED,
"55" => 0x1B01A57B,
"56" => 0x8208F4C1,
"57" => 0xF50FC457,
"58" => 0x65B0D9C6,
"59" => 0x12B7E950,
"5A" => 0x8BBEB8EA,
"5B" => 0xFCB9887C,
"5C" => 0x62DD1DDF,
"5D" => 0x15DA2D49,
"5E" => 0x8CD37CF3,
"5F" => 0xFBD44C65,
"60" => 0x4DB26158,
"61" => 0x3AB551CE,
"62" => 0xA3BC0074,
"63" => 0xD4BB30E2,
"64" => 0x4ADFA541,
"65" => 0x3DD895D7,
"66" => 0xA4D1C46D,
"67" => 0xD3D6F4FB,
"68" => 0x4369E96A,
"69" => 0x346ED9FC,
"6A" => 0xAD678846,
"6B" => 0xDA60B8D0,
"6C" => 0x44042D73,
"6D" => 0x33031DE5,
"6E" => 0xAA0A4C5F,
"6F" => 0xDD0D7CC9,
"70" => 0x5005713C,
"71" => 0x270241AA,
"72" => 0xBE0B1010,
"73" => 0xC90C2086,
"74" => 0x5768B525,
"75" => 0x206F85B3,
"76" => 0xB966D409,
"77" => 0xCE61E49F,
"78" => 0x5EDEF90E,
"79" => 0x29D9C998,
"7A" => 0xB0D09822,
"7B" => 0xC7D7A8B4,
"7C" => 0x59B33D17,
"7D" => 0x2EB40D81,
"7E" => 0xB7BD5C3B,
"7F" => 0xC0BA6CAD,
"80" => 0xEDB88320,
"81" => 0x9ABFB3B6,
"82" => 0x03B6E20C,
"83" => 0x74B1D29A,
"84" => 0xEAD54739,
"85" => 0x9DD277AF,
"86" => 0x04DB2615,
"87" => 0x73DC1683,
"88" => 0xE3630B12,
"89" => 0x94643B84,
"8A" => 0x0D6D6A3E,
"8B" => 0x7A6A5AA8,
"8C" => 0xE40ECF0B,
"8D" => 0x9309FF9D,
"8E" => 0x0A00AE27,
"8F" => 0x7D079EB1,
"90" => 0xF00F9344,
"91" => 0x8708A3D2,
"92" => 0x1E01F268,
"93" => 0x6906C2FE,
"94" => 0xF762575D,
"95" => 0x806567CB,
"96" => 0x196C3671,
"97" => 0x6E6B06E7,
"98" => 0xFED41B76,
"99" => 0x89D32BE0,
"9A" => 0x10DA7A5A,
"9B" => 0x67DD4ACC,
"9C" => 0xF9B9DF6F,
"9D" => 0x8EBEEFF9,
"9E" => 0x17B7BE43,
"9F" => 0x60B08ED5,
"A0" => 0xD6D6A3E8,
"A1" => 0xA1D1937E,
"A2" => 0x38D8C2C4,
"A3" => 0x4FDFF252,
"A4" => 0xD1BB67F1,
"A5" => 0xA6BC5767,
"A6" => 0x3FB506DD,
"A7" => 0x48B2364B,
"A8" => 0xD80D2BDA,
"A9" => 0xAF0A1B4C,
"AA" => 0x36034AF6,
"AB" => 0x41047A60,
"AC" => 0xDF60EFC3,
"AD" => 0xA867DF55,
"AE" => 0x316E8EEF,
"AF" => 0x4669BE79,
"B0" => 0xCB61B38C,
"B1" => 0xBC66831A,
"B2" => 0x256FD2A0,
"B3" => 0x5268E236,
"B4" => 0xCC0C7795,
"B5" => 0xBB0B4703,
"B6" => 0x220216B9,
"B7" => 0x5505262F,
"B8" => 0xC5BA3BBE,
"B9" => 0xB2BD0B28,
"BA" => 0x2BB45A92,
"BB" => 0x5CB36A04,
"BC" => 0xC2D7FFA7,
"BD" => 0xB5D0CF31,
"BE" => 0x2CD99E8B,
"BF" => 0x5BDEAE1D,
"C0" => 0x9B64C2B0,
"C1" => 0xEC63F226,
"C2" => 0x756AA39C,
"C3" => 0x026D930A,
"C4" => 0x9C0906A9,
"C5" => 0xEB0E363F,
"C6" => 0x72076785,
"C7" => 0x05005713,
"C8" => 0x95BF4A82,
"C9" => 0xE2B87A14,
"CA" => 0x7BB12BAE,
"CB" => 0x0CB61B38,
"CC" => 0x92D28E9B,
"CD" => 0xE5D5BE0D,
"CE" => 0x7CDCEFB7,
"CF" => 0x0BDBDF21,
"D0" => 0x86D3D2D4,
"D1" => 0xF1D4E242,
"D2" => 0x68DDB3F8,
"D3" => 0x1FDA836E,
"D4" => 0x81BE16CD,
"D5" => 0xF6B9265B,
"D6" => 0x6FB077E1,
"D7" => 0x18B74777,
"D8" => 0x88085AE6,
"D9" => 0xFF0F6A70,
"DA" => 0x66063BCA,
"DB" => 0x11010B5C,
"DC" => 0x8F659EFF,
"DD" => 0xF862AE69,
"DE" => 0x616BFFD3,
"DF" => 0x166CCF45,
"E0" => 0xA00AE278,
"E1" => 0xD70DD2EE,
"E2" => 0x4E048354,
"E3" => 0x3903B3C2,
"E4" => 0xA7672661,
"E5" => 0xD06016F7,
"E6" => 0x4969474D,
"E7" => 0x3E6E77DB,
"E8" => 0xAED16A4A,
"E9" => 0xD9D65ADC,
"EA" => 0x40DF0B66,
"EB" => 0x37D83BF0,
"EC" => 0xA9BCAE53,
"ED" => 0xDEBB9EC5,
"EE" => 0x47B2CF7F,
"EF" => 0x30B5FFE9,
"F0" => 0xBDBDF21C,
"F1" => 0xCABAC28A,
"F2" => 0x53B39330,
"F3" => 0x24B4A3A6,
"F4" => 0xBAD03605,
"F5" => 0xCDD70693,
"F6" => 0x54DE5729,
"F7" => 0x23D967BF,
"F8" => 0xB3667A2E,
"F9" => 0xC4614AB8,
"FA" => 0x5D681B02,
"FB" => 0x2A6F2B94,
"FC" => 0xB40BBE37,
"FD" => 0xC30C8EA1,
"FE" => 0x5A05DF1B,
"FF" => 0x2D02EF8D
];
require_once './src/D2Functions.php'; require_once './src/D2Functions.php';
$filename = "D:\Diablo II\MODS\ironman-dev\save\Sorc.d2s"; $filename = "D:\Diablo II\MODS\ironman-dev\save\Sorc.d2s";
$fp = fopen($filename, "rb+"); $fp = fopen($filename, "rb+");
$filesize = filesize($filename);
$pucData = file_get_contents($filename);
ddump(unpack('C*', $pucData));
// pucData - pointer to the byte stream of the .d2s file
// iSize - number of bytes in the stream ( filesize )
function checksum($fp, $pucData, $iSize, $xorTableHex) {
// delete old checksum at offset 0x0C - byte 12
fseek($fp, 12);
// (I) unsigned integer (machine dependent size and byte order)
fwrite($fp, pack('I', 0)); // produces 4 bytes
$uVar = 0xFFFFFFFF;
for($i=0;$i<$iSize;$i++) {
// $hex = strtoupper(bin2hex($pucData[$i]));
// getting correct bytes here, matches file in hex editor
// dump((strtoupper(dechex($xorTableHex[$hex]))));
// uVar1 = uVar1 >> 8 ^ DWORD_ARRAY_6fd2a248[(uint)*param_1 ^ uVar1 & 0xff];
// $xorTableHex = $xorTableHex = [
// "00" => 0x0,
// "01" => 0x77073096,
// "02" => 0xEE0E612C] etc.
// uVar1 >> 8 ^ *(uint *)(&DAT_6fd2a248 + ((uint)*param_1 ^ uVar1 & 0xff) * 4);
$dec = hexdec(dechex(unpack('C', $pucData[$i])[1]));
$uVar = (($uVar << 1)|( $uVar >> 31)) + $dec;
// $uVar = $uVar >> 8 ^ ($xorTableHex[$hex] ^ ($uVar & 0xFF) * 4);
// yeah, it was producing wrong val cuz I there is no * 4
}
dump(swapEndianness(dechex($uVar)));
//fseek($fp, 12);
//fwrite($fp, pack('I', $uiCS));
}
//fseek($fp, 347);
//fwrite($fp, pack('C', 0xFD));
//fseek($fp, 348);
//fwrite($fp, pack('C', 0x9F));
checksum($fp, $pucData, $filesize, $xorTableHex);
fseek($fp, 12);
fwrite($fp, pack('I', 0)); // produces 4 bytes
$fileData = unpack('C*', file_get_contents($filename));
fseek($fp, 12);
fwrite($fp, pack('H8', checksum($fileData)));
dump(checksum($fileData));
fclose($fp); fclose($fp);
+17 -3
View File
@@ -267,9 +267,19 @@ EOT;
// get all cube rows // get all cube rows
// changed enabled=1 to enabled > 0 for CubeOps.dll users // changed enabled=1 to enabled > 0 for CubeOps.dll users
$sql = "SELECT * FROM cubemain WHERE enabled > 0"; $sql = "
SELECT *
FROM cubemain
WHERE enabled > 0
AND `input 1` <> 'ib3'
AND `description` NOT LIKE '%Stone x%'
AND `description` NOT LIKE '%Unstacker%'
";
$res = PDO_FetchAll($sql); $res = PDO_FetchAll($sql);
// ddump($res);
// process each cube row here // process each cube row here
foreach ($res as $r) { foreach ($res as $r) {
@@ -350,7 +360,8 @@ EOT;
] ]
); );
// dump($output_codes);
// ddump($output_codes);
foreach ($output_codes as $outputNum => $value) { foreach ($output_codes as $outputNum => $value) {
if (str_contains($value, ',')) { if (str_contains($value, ',')) {
@@ -483,7 +494,10 @@ EOT;
$output['mods'][$k]["str"] = $idesc->getDesc($params); $output['mods'][$k]["str"] = $idesc->getDesc($params);
} }
// var_dump($output);
// dump($output);
// var_dump($output);
// At this point, $output contains raw accurte data // At this point, $output contains raw accurte data
// TODO: build output correctly // TODO: build output correctly
// input1-input7,output a,b,c item codes can be found in $strings // input1-input7,output a,b,c item codes can be found in $strings
+3
View File
@@ -484,6 +484,9 @@ $(document).ready(function () {
} }
$('.a-select, .w-select, .m-select').removeAttr('required');
/* /*
* THIS LINE BREAKS hidden fields and set them to blank. * THIS LINE BREAKS hidden fields and set them to blank.
+4 -4
View File
@@ -41,9 +41,9 @@ $filePath = str_replace("\\", "\\\\", $filePath);
$fp = fopen($filePath, "rb+"); $fp = fopen($filePath, "rb+");
// delete old checksum at offset 0x0C - byte 12 // delete old checksum at offset 0x0C - byte 12
fseek($fp, 12); //fseek($fp, 12);
// (I) unsigned integer (machine dependent size and byte order) // (I) unsigned integer (machine dependent size and byte order)
fwrite($fp, pack('I', 0)); // produces 4 bytes //fwrite($fp, pack('I', 0)); // produces 4 bytes
// edit quests which are checked, to Just finished FE FF // edit quests which are checked, to Just finished FE FF
foreach ($q as $k => $v) { foreach ($q as $k => $v) {
@@ -128,9 +128,9 @@ if ($p['wp_all'] == "1") {
$checksum = (shell_exec("bin\d2scs.exe \"$filePath\"")); $checksum = (shell_exec("bin\d2scs.exe \"$filePath\""));
// write NEW checksum at offset 0x0C - byte 12 // write NEW checksum at offset 0x0C - byte 12
fseek($fp, 12); //fseek($fp, 12);
// (I) unsigned integer (machine dependent size and byte order) // (I) unsigned integer (machine dependent size and byte order)
fwrite($fp, pack('H*', $checksum)); // produces 4 bytes //fwrite($fp, pack('H*', $checksum)); // produces 4 bytes
fclose($fp); fclose($fp);
+2
View File
@@ -1,6 +1,8 @@
<?php <?php
// uniqu eitem editor saver,, needs more work
error_reporting(E_ERROR | E_PARSE); error_reporting(E_ERROR | E_PARSE);
set_time_limit(-1); set_time_limit(-1);
ini_set('max_input_time', '-1'); ini_set('max_input_time', '-1');
+66
View File
@@ -0,0 +1,66 @@
<?php
class D2BitReader {
private string $bits;
private int $offset = 0;
public function __construct(string $bits = '') {
$this->bits = $bits;
return true;
}
public function skip(int $numBits): int {
$this->offset += $numBits;
return $this->offset;
}
/* read X number of bits, like fread */
public function read(int $numBits = 0, bool $str = true) {
$bits = null;
for ($i = $this->offset; $i < $this->offset + $numBits; $i++) {
$str ? $bits .= $this->bits[$i] : $bits[] = $this->bits[$i];
}
$this->offset += $numBits;
return $bits;
}
/* seek to offset (like fseek) */
public function seek(int $pos): bool {
if ($pos < 0 || $pos > strlen($this->bits)) {
return false;
}
$this->offset = $pos;
return true;
}
/* rewind offset to 0 */
public function rewind(): bool {
$this->offset = 0;
return true;
}
/* Get Bit */
public function getBit(string $bitNum): int {
if ($bitNum < 0 || $bitNum > strlen($this->bits)) {
return false;
}
return ((int) $this->bits[$bitNum] ? 1 : 0 );
}
/* Set Bit */
public function setBit(int $bitNum, int $bitVal): bool {
if ($bitVal < 0 || $bitVal > 1) {
return false;
}
$this->bits[$bitNum] = $bitVal;
return true;
}
}
+66 -2
View File
@@ -75,11 +75,75 @@ function strtobits(string $str): string {
return $ret; return $ret;
} }
function swapEndianness($hex) { function swapEndianness(string $hex) {
return implode('', array_reverse(str_split($hex, 2))); return implode('', array_reverse(str_split($hex, 2)));
} }
function modifyBit(int $n, int $p, bool $b){ function setBit(int $n, int $p, bool $b){
return ($b ? ($n | (1 << $p)) : ($n & ~(1 << $p)) ); return ($b ? ($n | (1 << $p)) : ($n & ~(1 << $p)) );
}
function getBit(int $b, int $p){
return intval(($b & (1 << $p)) != 0);
}
function checksum($fileData) {
$nSignature = 0;
foreach($fileData as $byte){
$nSignature = ((($nSignature << 1) | ($nSignature >> 31)) + $byte) & 0xFFFFFFFF;
}
return swapEndianness(dechex($nSignature));
}
/**
* Find the position of the Xth occurrence of a substring in a string
* @param $haystack
* @param $needle
* @param $number integer > 0
* @return int
*/
function strposX($haystack, $needle, $number) {
if ($number == 1) {
return strpos($haystack, $needle);
} elseif ($number > 1) {
return strpos($haystack, $needle, strposX($haystack, $needle, $number - 1) + strlen($needle));
} else {
return error_log('Error: Value for parameter $number is out of range');
}
}
function isBit(string $bit): int {
return ((int) $bit ? 1 : 0 );
}
function toBits($input): string {
$output = '';
if (is_string($input)){
foreach(str_split($input) as $i){
$output .= str_pad(decbin(ord($i)), 8, 0, STR_PAD_LEFT);
}
return $output;
} else if (is_int($input)){
return str_pad(decbin($input), 8, 0, STR_PAD_LEFT);
} else if (is_array($input)){
foreach ($input as $i) {
$output .= tobits($i);
}
return $output;
}
}
function print_mem()
{
/* Currently used memory */
$mem_usage = memory_get_usage();
/* Peak memory usage */
$mem_peak = memory_get_peak_usage();
echo 'The script is now using: <strong>' . round($mem_usage / 1024) . 'KB</strong> of memory.<br>';
echo 'Peak usage: <strong>' . round($mem_peak / 1024) . 'KB</strong> of memory.<br><br>';
} }
+105
View File
@@ -0,0 +1,105 @@
<?php
require_once 'D2BitReader.php';
class D2Item {
private string $_bits;
public $basename = ''; //name of the base item
public $item_name = ''; //name string
public $item_rank = ''; //normal/exceptional/elite
public $item_type = ''; //basic type: armor/weapon/misc
//flags
public $identified = 0;
public $sockets = 0;
public $ear = 0;
public $starter = 0;
public $compact = 0;
public $ethereal;
public $personalized;
public $runeword;
public $version;
public $runeword_name = '';
public $runes_title = '';
//placement
public $location = 0;
public $body = 0;
public $col = 0;
public $row = 0;
public $container = 0;
public $parent;
public $storage;
public $bodypart;
public $invH = 0;
public $invW = 0;
public $beltrows = 1;
//features
public $item_code = ''; //3 letter code from txt
public $SocketsFilled = 0;
public $SocketsNum = 0;
public $socketable = false; //gem, rune, jewel
public $fingerprint = '';
public $itemlvl = 0; //item level
public $quality = 0;
public $isCharm = false;
public $isJewel = false;
public $magic_rank = 'Normal'; //normal/magic/rare/crafted/set/unique
public $set_id = 0; //set item id from txt
public $set_item = '';
public $set_name = 0; //set name, if it is set item,
public $personname = '';
public $questdif = -1;
public $gold;
public $GUID = '';
public $defense = 0;
public $mindam = 0;
public $maxdam = 0;
public $mindam2 = 0;
public $maxdam2 = 0;
public $mindammi = 0;
public $maxdammi = 0;
public $MaxDur = 0;
public $CurDur = 0;
public $reqlvl = 0;
public $reqstr = 0;
public $reqdex = 0;
public $speed = 0;
public $throwing = 0;
public $stackable = 0;
public $charName = ''; //ear's name
public $gfx; //graphic file name
public $baseTrans = -1; //transform indexes for colour remap base item
public $magicTrans = -1; //transform indexes for colour remap magic item
public $type; //type column from txt
public $spelldesc = ''; //desc for potions
public $ditem; //link to item properties from txt
//mods
public $dammult = 100; //damage multiply
public $damminadd = 0; //damage add
public $dammaxadd = 0; //damage add
public $defmult = 100; //defense multiply
public $defadd = 0; //defense multiply
public $resist = array(0, 0, 0, 0, 0, 0); //phy, mag, fire, light, cold, poison
public $attributes = array(0, 0, 0, 0); //str, dex, vit, ene
//arrays
//socketed items, collected in above function,
//because item has only data for itselt, and
//gems/runes/jewels are standalone
public $SocketItems = array();
public $properties = array(); //item variable properties
public $propids = array(); //properties ids list
public function __construct(string $bits){
if ($bit == '') return false;
$this->bits = $bits;
$this->parseItem();
}
public function parseItem(){}
}
+22
View File
@@ -814,6 +814,28 @@ class D2ItemData {
"min" => $return['min' . $counter], "min" => $return['min' . $counter],
"max" => $return['max' . $counter], "max" => $return['max' . $counter],
]; ];
} else if ($v['prop1'] == 'sock' ||
$v['prop2'] == 'sock' ||
$v['prop3'] == 'sock' ||
$v['prop4'] == 'sock' ||
$v['prop5'] == 'sock' ||
$v['prop6'] == 'sock' ||
$v['prop7'] == 'sock') {
$params = [
'string1' => "Sockets",
'string2' => "",
'gstring1' => "",
'gstring2' => "",
'descfunc' => "9",
'descval' => "1",
'dgrp' => "",
'dgrpfunc' => "",
'dgrpval' => "",
"prop" => $return['prop' . $counter],
"par" => $return['par' . $counter],
"min" => $return['min' . $counter],
"max" => $return['max' . $counter],
];
} else { } else {
$params = [ $params = [
'string1' => $v['desc']['string1'], 'string1' => $v['desc']['string1'],
+1 -262
View File
@@ -297,268 +297,7 @@ class D2SaveFileStructureData {
public $_qNM; public $_qNM;
public $_qHell; public $_qHell;
public $xorTable = [
"00" => 0x0,
"01" => 0x77073096,
"02" => 0xEE0E612C,
"03" => 0x990951BA,
"04" => 0x076DC419,
"05" => 0x706AF48F,
"06" => 0xE963A535,
"07" => 0x9E6495A3,
"08" => 0x0EDB8832,
"09" => 0x79DCB8A4,
"0A" => 0xE0D5E91E,
"0B" => 0x97D2D988,
"0C" => 0x09B64C2B,
"0D" => 0x7EB17CBD,
"0E" => 0xE7B82D07,
"0F" => 0x90BF1D91,
"10" => 0x1DB71064,
"11" => 0x6AB020F2,
"12" => 0xF3B97148,
"13" => 0x84BE41DE,
"14" => 0x1ADAD47D,
"15" => 0x6DDDE4EB,
"16" => 0xF4D4B551,
"17" => 0x83D385C7,
"18" => 0x136C9856,
"19" => 0x646BA8C0,
"1A" => 0xFD62F97A,
"1B" => 0x8A65C9EC,
"1C" => 0x14015C4F,
"1D" => 0x63066CD9,
"1E" => 0xFA0F3D63,
"1F" => 0x8D080DF5,
"20" => 0x3B6E20C8,
"21" => 0x4C69105E,
"22" => 0xD56041E4,
"23" => 0xA2677172,
"24" => 0x3C03E4D1,
"25" => 0x4B04D447,
"26" => 0xD20D85FD,
"27" => 0xA50AB56B,
"28" => 0x35B5A8FA,
"29" => 0x42B2986C,
"2A" => 0xDBBBC9D6,
"2B" => 0xACBCF940,
"2C" => 0x32D86CE3,
"2D" => 0x45DF5C75,
"2E" => 0xDCD60DCF,
"2F" => 0xABD13D59,
"30" => 0x26D930AC,
"31" => 0x51DE003A,
"32" => 0xC8D75180,
"33" => 0xBFD06116,
"34" => 0x21B4F4B5,
"35" => 0x56B3C423,
"36" => 0xCFBA9599,
"37" => 0xB8BDA50F,
"38" => 0x2802B89E,
"39" => 0x5F058808,
"3A" => 0xC60CD9B2,
"3B" => 0xB10BE924,
"3C" => 0x2F6F7C87,
"3D" => 0x58684C11,
"3E" => 0xC1611DAB,
"3F" => 0xB6662D3D,
"40" => 0x76DC4190,
"41" => 0x01DB7106,
"42" => 0x98D220BC,
"43" => 0xEFD5102A,
"44" => 0x71B18589,
"45" => 0x06B6B51F,
"46" => 0x9FBFE4A5,
"47" => 0xE8B8D433,
"48" => 0x7807C9A2,
"49" => 0x0F00F934,
"4A" => 0x9609A88E,
"4B" => 0xE10E9818,
"4C" => 0x7F6A0DBB,
"4D" => 0x086D3D2D,
"4E" => 0x91646C97,
"4F" => 0xE6635C01,
"50" => 0x6B6B51F4,
"51" => 0x1C6C6162,
"52" => 0x856530D8,
"53" => 0xF262004E,
"54" => 0x6C0695ED,
"55" => 0x1B01A57B,
"56" => 0x8208F4C1,
"57" => 0xF50FC457,
"58" => 0x65B0D9C6,
"59" => 0x12B7E950,
"5A" => 0x8BBEB8EA,
"5B" => 0xFCB9887C,
"5C" => 0x62DD1DDF,
"5D" => 0x15DA2D49,
"5E" => 0x8CD37CF3,
"5F" => 0xFBD44C65,
"60" => 0x4DB26158,
"61" => 0x3AB551CE,
"62" => 0xA3BC0074,
"63" => 0xD4BB30E2,
"64" => 0x4ADFA541,
"65" => 0x3DD895D7,
"66" => 0xA4D1C46D,
"67" => 0xD3D6F4FB,
"68" => 0x4369E96A,
"69" => 0x346ED9FC,
"6A" => 0xAD678846,
"6B" => 0xDA60B8D0,
"6C" => 0x44042D73,
"6D" => 0x33031DE5,
"6E" => 0xAA0A4C5F,
"6F" => 0xDD0D7CC9,
"70" => 0x5005713C,
"71" => 0x270241AA,
"72" => 0xBE0B1010,
"73" => 0xC90C2086,
"74" => 0x5768B525,
"75" => 0x206F85B3,
"76" => 0xB966D409,
"77" => 0xCE61E49F,
"78" => 0x5EDEF90E,
"79" => 0x29D9C998,
"7A" => 0xB0D09822,
"7B" => 0xC7D7A8B4,
"7C" => 0x59B33D17,
"7D" => 0x2EB40D81,
"7E" => 0xB7BD5C3B,
"7F" => 0xC0BA6CAD,
"80" => 0xEDB88320,
"81" => 0x9ABFB3B6,
"82" => 0x03B6E20C,
"83" => 0x74B1D29A,
"84" => 0xEAD54739,
"85" => 0x9DD277AF,
"86" => 0x04DB2615,
"87" => 0x73DC1683,
"88" => 0xE3630B12,
"89" => 0x94643B84,
"8A" => 0x0D6D6A3E,
"8B" => 0x7A6A5AA8,
"8C" => 0xE40ECF0B,
"8D" => 0x9309FF9D,
"8E" => 0x0A00AE27,
"8F" => 0x7D079EB1,
"90" => 0xF00F9344,
"91" => 0x8708A3D2,
"92" => 0x1E01F268,
"93" => 0x6906C2FE,
"94" => 0xF762575D,
"95" => 0x806567CB,
"96" => 0x196C3671,
"97" => 0x6E6B06E7,
"98" => 0xFED41B76,
"99" => 0x89D32BE0,
"9A" => 0x10DA7A5A,
"9B" => 0x67DD4ACC,
"9C" => 0xF9B9DF6F,
"9D" => 0x8EBEEFF9,
"9E" => 0x17B7BE43,
"9F" => 0x60B08ED5,
"A0" => 0xD6D6A3E8,
"A1" => 0xA1D1937E,
"A2" => 0x38D8C2C4,
"A3" => 0x4FDFF252,
"A4" => 0xD1BB67F1,
"A5" => 0xA6BC5767,
"A6" => 0x3FB506DD,
"A7" => 0x48B2364B,
"A8" => 0xD80D2BDA,
"A9" => 0xAF0A1B4C,
"AA" => 0x36034AF6,
"AB" => 0x41047A60,
"AC" => 0xDF60EFC3,
"AD" => 0xA867DF55,
"AE" => 0x316E8EEF,
"AF" => 0x4669BE79,
"B0" => 0xCB61B38C,
"B1" => 0xBC66831A,
"B2" => 0x256FD2A0,
"B3" => 0x5268E236,
"B4" => 0xCC0C7795,
"B5" => 0xBB0B4703,
"B6" => 0x220216B9,
"B7" => 0x5505262F,
"B8" => 0xC5BA3BBE,
"B9" => 0xB2BD0B28,
"BA" => 0x2BB45A92,
"BB" => 0x5CB36A04,
"BC" => 0xC2D7FFA7,
"BD" => 0xB5D0CF31,
"BE" => 0x2CD99E8B,
"BF" => 0x5BDEAE1D,
"C0" => 0x9B64C2B0,
"C1" => 0xEC63F226,
"C2" => 0x756AA39C,
"C3" => 0x026D930A,
"C4" => 0x9C0906A9,
"C5" => 0xEB0E363F,
"C6" => 0x72076785,
"C7" => 0x05005713,
"C8" => 0x95BF4A82,
"C9" => 0xE2B87A14,
"CA" => 0x7BB12BAE,
"CB" => 0x0CB61B38,
"CC" => 0x92D28E9B,
"CD" => 0xE5D5BE0D,
"CE" => 0x7CDCEFB7,
"CF" => 0x0BDBDF21,
"D0" => 0x86D3D2D4,
"D1" => 0xF1D4E242,
"D2" => 0x68DDB3F8,
"D3" => 0x1FDA836E,
"D4" => 0x81BE16CD,
"D5" => 0xF6B9265B,
"D6" => 0x6FB077E1,
"D7" => 0x18B74777,
"D8" => 0x88085AE6,
"D9" => 0xFF0F6A70,
"DA" => 0x66063BCA,
"DB" => 0x11010B5C,
"DC" => 0x8F659EFF,
"DD" => 0xF862AE69,
"DE" => 0x616BFFD3,
"DF" => 0x166CCF45,
"E0" => 0xA00AE278,
"E1" => 0xD70DD2EE,
"E2" => 0x4E048354,
"E3" => 0x3903B3C2,
"E4" => 0xA7672661,
"E5" => 0xD06016F7,
"E6" => 0x4969474D,
"E7" => 0x3E6E77DB,
"E8" => 0xAED16A4A,
"E9" => 0xD9D65ADC,
"EA" => 0x40DF0B66,
"EB" => 0x37D83BF0,
"EC" => 0xA9BCAE53,
"ED" => 0xDEBB9EC5,
"EE" => 0x47B2CF7F,
"EF" => 0x30B5FFE9,
"F0" => 0xBDBDF21C,
"F1" => 0xCABAC28A,
"F2" => 0x53B39330,
"F3" => 0x24B4A3A6,
"F4" => 0xBAD03605,
"F5" => 0xCDD70693,
"F6" => 0x54DE5729,
"F7" => 0x23D967BF,
"F8" => 0xB3667A2E,
"F9" => 0xC4614AB8,
"FA" => 0x5D681B02,
"FB" => 0x2A6F2B94,
"FC" => 0xB40BBE37,
"FD" => 0xC30C8EA1,
"FE" => 0x5A05DF1B,
"FF" => 0x2D02EF8D
];
/* /*
Initialize Skills From Skills.txt Initialize Skills From Skills.txt
*/ */
+1 -1
View File
@@ -52,7 +52,7 @@
<link rel="stylesheet" href="/res/font-awesome.min.css"> <link rel="stylesheet" href="/res/font-awesome.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com"> <link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Lato:wght@300&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Lato:wght@300&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://bootswatch.com/4/sketchy/bootstrap.min.css"> <link rel="stylesheet" href="https://bootswatch.com/4/lumen/bootstrap.min.css">
<link rel="stylesheet" href="/res/style.css"> <link rel="stylesheet" href="/res/style.css">
<link rel="stylesheet" href="/res/<?php echo $css ?>"> <link rel="stylesheet" href="/res/<?php echo $css ?>">
<style> <style>
+108 -37
View File
@@ -1,45 +1,116 @@
<?php <?php
// from unpack('H*', file_get_contents("Char.d2s")) for 3v4l.org to read d2s file here
$data = hex2bin('55aa55aa60000000f1060000b5bc59b300000000536f72630000000000000000000000002400000001103863000000003cc7ae62ffffffffffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000000000000570300000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000005e3e9b11000000008888d5f80100000035b70300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000576f6f21060000002a0101000190fd9ffe9ffd9ffe9ffd9f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057530100000050000201ffffffff7f00000000000000000000000000000000000201ffffffff7f00000000000000000000000000000000000201ffffffff7f0000000000000000000000000000000000017734002e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067660028083082000a06644000b10252067094c1018082800020292400480a0a0030c202008cc060dcc0f0ca3afa160a0000e03f696600000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000004a4d32004a4d100082006500069226160382af144fb080e03f4a4d1000820065000a9226260302791c00c480e03f4a4d10008000654415c076c606821c7ffff58080010a06fe034a4d1000800065008013268303827e82896086dccb000066c5bcfeffff014a4d1000820065000022f6860782b067b7ec80e03f4a4d1000820065001a922636038249b154da80a025040000c07f4a4d1000a0006500a442665363034a4d1000a0006500fe13367703024a4d1000a0006500de13362703024a4d1000a0006500be13361703024a4d1000a00065009e13360703024a4d1000a00065007e1336a707024a4d1000a00065005e13369707024a4d1000a00065003e1336f706024a4d1000a0006500c013e65606024a4d1000a00065006012d68607024a4d1000a00065000e12d60603024a4d1000a00065006412564306024a4d1000800065001e83179303029920441686e03f4a4d1000a0006500fe12d69606024a4d1000a0006500de12d68606024a4d1000a0006500be12d67606024a4d1000a00065009e12e67606024a4d1000a00065007e12e69606024a4d1000a0006500fc13e6a606024a4d1000a0006500dc13c68603024a4d1000a0006500bc13e6b606024a4d1000800065009c83272303826f9aed3186e03f4a4d1000800065007c8317730302acd0c26e86e03f4a4d1000a00065005c13560603024a4d1000a00065003c13569607024a4d1000a00065001c13464603024a4d1000a00065001212d66607024a4d1000a00865001412d66607024a4d1000a0006500fc1226f606024a4d1000a0006500dc12265607024a4d1000a0086500bc12265607024a4d1000a00865009c12265607024a4d1000a00865007c12265607024a4d1000a0086500fa13265607024a4d1000a0006500da43665363034a4d1000a0086500ba43665363034a4d1000a00065009a53468333064a4d10008000650016421616038245fc36c6822cff014a4d100080006500a032166707028c6e88690101000408052c30c0c00054e03f4a4d10008000650411c026c60602385900c78080010a08fe034a4d1000800065004632166707822c1b5e930001000498042c30c0c00054e03f4a4d1000800065007a8337130382a07c2a5786e03f4a4d1008800065000ec326c60602915c92ea8280010a07e23f4a4d100880046500b23237470612e9b107ed80104b83c140fc3776ece0f80f4a4d1000a00065180010365603024a4d00006a664a4d00006b6600');
error_reporting(E_ERROR | E_PARSE);
set_time_limit(-1);
ini_set('max_input_time', '-1');
ini_set('max_execution_time', '0');
session_start();
ob_start();
require_once './testData.php'; class D2ByteReader {
private string $data;
require_once './config.php'; private int $offset = 0;
require_once './_pdo.php';
require_once "./src/D2Functions.php"; public function __construct(string $data){
require_once './src/D2ItemData.php'; if (!$data) return false;
require_once './src/D2ItemDesc.php'; $this->data = $data;
require_once './src/D2DocGenerator.php'; }
define('DB_FILE', "ironman-dev.db"); public function skip(int $numBytes): bool {
PDO_Connect("sqlite:" . DB_FILE); if ($numBytes < 0 || $numBytes > strlen($this->data)) return false;
$this->offset += $numBytes;
$filename = "D:\Diablo II\MODS\ironman-dev\save\Test.d2s"; return $true;
$filename = str_replace("\\", "\\\\", $filename);
$fp = fopen($filename, "rb+");
// delete old checksum at offset 0x0C - byte 12
fseek($fp, 12);
// (I) unsigned integer (machine dependent size and byte order)
fwrite($fp, pack('I', 0)); // produces 4 bytes
// edit quest test, den of evil }
fseek($fp, 347);
fwrite($fp, pack('C', 0xFD)); public function seek(int $pos): bool {
fseek($fp, 348); if ($pos < 0 || $pos > strlen($this->data)) return false;
fwrite($fp, pack('C', 0x9F)); $this->offset = $pos;
return true;
}
public function read(int $numBytes, bool $str = true){
$bytes = null;
for ($i = $this->offset; $i < $this->offset + $numBytes; $i++) {
$str ? $bytes .= $this->data[$i] : $bytes[] = $this->data[$i];
}
return unpack('H*', $bytes);
}
public function rewind() : bool {
$this->offset = 0;
return true;
}
public function write8(int $offset, int $byte){
$this->data[$offset] = pack('C', $byte);
}
public function writeBytes(int $offset, string $bytes){
if ($offset < 0 || $offset > strlen($this->data) || $bytes == '') return false;
$_bytes = str_split($bytes, 2);
foreach($_bytes as $k => $byte){
$pos = $offset + $k;
$this->data[$pos] = pack('H*', $byte);
}
}
public function getData(){
return $this->data ? $this->data : false;
}
public function getOffset(): int {
return $this->offset;
}
/*
@return Byte with Nth bit set to X
*/
public function setBit(int $byte, int $pos, bool $bit){
return ($bit ? ($byte | (1 << $pos)) : ($byte & ~(1 << $pos)) );
}
/*
@return Bit at Nth position in Byte
*/
public function getBit(int $byte, int $pos) : int {
return intval(($byte & (1 << $pos)) != 0);
}
}
$checksum = swapEndianness(shell_exec("bin\d2scs.exe \"$filename\"")); $c = new D2ByteReader($data);
$c->seek(12);
$checksum = $c->read(4);
var_dump($checksum);
$c->write8(12, 0xFF);
$checksum = $c->read(4);
var_dump($checksum);
$c->writeBytes(12, "FFC0FDA1"); // invalid checksum, but just testing write. Works!
$checksum = $c->read(4);
var_dump($checksum);
$c->writeBytes(12, "b5bc59b3"); // Valid checksum, but just testing write. Works!
$checksum = $c->read(4);
var_dump($checksum);
// write NEW checksum at offset 0x0C - byte 12 /*
fseek($fp, 12);
// (I) unsigned integer (machine dependent size and byte order)
fwrite($fp, pack('H*', $checksum)); // produces 4 bytes
Barely any binary functions, all string manipulation on binary files. Working!
fclose($fp); To just modify bits in an aligned byte, use setBit();
To just get which bit is set in a byte, use getBit();
To read X arbitary unaligned bits in bytes,
Seek to offset,
Read X bytes,
Convert X bytes to bits,
Reverse bit order in each byte
Load D2BitReader,
Modify nth Bit,
Return all bits
Convert to bytes
Reverse bit order in byte
Save bytes
function setBit(int $n, int $p, bool $b){
return ($b ? ($n | (1 << $p)) : ($n & ~(1 << $p)) );
}
function getBit(int $b, int $p){
return intval(($b & (1 << $p)) != 0);
}
*/
-519
View File
@@ -1,519 +0,0 @@
<?php
$xorTableDec = [
1 => 0x0,
2 => 0x77073096,
3 => 0xEE0E612C,
4 => 0x990951BA,
5 => 0x076DC419,
6 => 0x706AF48F,
7 => 0xE963A535,
8 => 0x9E6495A3,
9 => 0x0EDB8832,
10 => 0x79DCB8A4,
11 => 0xE0D5E91E,
12 => 0x97D2D988,
13 => 0x09B64C2B,
14 => 0x7EB17CBD,
15 => 0xE7B82D07,
16 => 0x90BF1D91,
17 => 0x1DB71064,
18 => 0x6AB020F2,
19 => 0xF3B97148,
20 => 0x84BE41DE,
21 => 0x1ADAD47D,
22 => 0x6DDDE4EB,
23 => 0xF4D4B551,
24 => 0x83D385C7,
25 => 0x136C9856,
26 => 0x646BA8C0,
27 => 0xFD62F97A,
28 => 0x8A65C9EC,
29 => 0x14015C4F,
30 => 0x63066CD9,
31 => 0xFA0F3D63,
32 => 0x8D080DF5,
33 => 0x3B6E20C8,
34 => 0x4C69105E,
35 => 0xD56041E4,
36 => 0xA2677172,
37 => 0x3C03E4D1,
38 => 0x4B04D447,
39 => 0xD20D85FD,
40 => 0xA50AB56B,
41 => 0x35B5A8FA,
42 => 0x42B2986C,
43 => 0xDBBBC9D6,
44 => 0xACBCF940,
45 => 0x32D86CE3,
46 => 0x45DF5C75,
47 => 0xDCD60DCF,
48 => 0xABD13D59,
49 => 0x26D930AC,
50 => 0x51DE003A,
51 => 0xC8D75180,
52 => 0xBFD06116,
53 => 0x21B4F4B5,
54 => 0x56B3C423,
55 => 0xCFBA9599,
56 => 0xB8BDA50F,
57 => 0x2802B89E,
58 => 0x5F058808,
59 => 0xC60CD9B2,
60 => 0xB10BE924,
61 => 0x2F6F7C87,
62 => 0x58684C11,
63 => 0xC1611DAB,
64 => 0xB6662D3D,
65 => 0x76DC4190,
66 => 0x01DB7106,
67 => 0x98D220BC,
68 => 0xEFD5102A,
69 => 0x71B18589,
70 => 0x06B6B51F,
71 => 0x9FBFE4A5,
72 => 0xE8B8D433,
73 => 0x7807C9A2,
74 => 0x0F00F934,
75 => 0x9609A88E,
76 => 0xE10E9818,
77 => 0x7F6A0DBB,
78 => 0x086D3D2D,
79 => 0x91646C97,
80 => 0xE6635C01,
81 => 0x6B6B51F4,
82 => 0x1C6C6162,
83 => 0x856530D8,
84 => 0xF262004E,
85 => 0x6C0695ED,
86 => 0x1B01A57B,
87 => 0x8208F4C1,
88 => 0xF50FC457,
89 => 0x65B0D9C6,
90 => 0x12B7E950,
91 => 0x8BBEB8EA,
92 => 0xFCB9887C,
93 => 0x62DD1DDF,
94 => 0x15DA2D49,
95 => 0x8CD37CF3,
96 => 0xFBD44C65,
97 => 0x4DB26158,
98 => 0x3AB551CE,
99 => 0xA3BC0074,
100 => 0xD4BB30E2,
101 => 0x4ADFA541,
102 => 0x3DD895D7,
103 => 0xA4D1C46D,
104 => 0xD3D6F4FB,
105 => 0x4369E96A,
106 => 0x346ED9FC,
107 => 0xAD678846,
108 => 0xDA60B8D0,
109 => 0x44042D73,
110 => 0x33031DE5,
111 => 0xAA0A4C5F,
112 => 0xDD0D7CC9,
113 => 0x5005713C,
114 => 0x270241AA,
115 => 0xBE0B1010,
116 => 0xC90C2086,
117 => 0x5768B525,
118 => 0x206F85B3,
119 => 0xB966D409,
120 => 0xCE61E49F,
121 => 0x5EDEF90E,
122 => 0x29D9C998,
123 => 0xB0D09822,
124 => 0xC7D7A8B4,
125 => 0x59B33D17,
126 => 0x2EB40D81,
127 => 0xB7BD5C3B,
128 => 0xC0BA6CAD,
129 => 0xEDB88320,
130 => 0x9ABFB3B6,
131 => 0x03B6E20C,
132 => 0x74B1D29A,
133 => 0xEAD54739,
134 => 0x9DD277AF,
135 => 0x04DB2615,
136 => 0x73DC1683,
137 => 0xE3630B12,
138 => 0x94643B84,
139 => 0x0D6D6A3E,
140 => 0x7A6A5AA8,
141 => 0xE40ECF0B,
142 => 0x9309FF9D,
143 => 0x0A00AE27,
144 => 0x7D079EB1,
145 => 0xF00F9344,
146 => 0x8708A3D2,
147 => 0x1E01F268,
148 => 0x6906C2FE,
149 => 0xF762575D,
150 => 0x806567CB,
151 => 0x196C3671,
152 => 0x6E6B06E7,
153 => 0xFED41B76,
154 => 0x89D32BE0,
155 => 0x10DA7A5A,
156 => 0x67DD4ACC,
157 => 0xF9B9DF6F,
158 => 0x8EBEEFF9,
159 => 0x17B7BE43,
160 => 0x60B08ED5,
161 => 0xD6D6A3E8,
162 => 0xA1D1937E,
163 => 0x38D8C2C4,
164 => 0x4FDFF252,
165 => 0xD1BB67F1,
166 => 0xA6BC5767,
167 => 0x3FB506DD,
168 => 0x48B2364B,
169 => 0xD80D2BDA,
170 => 0xAF0A1B4C,
171 => 0x36034AF6,
172 => 0x41047A60,
173 => 0xDF60EFC3,
174 => 0xA867DF55,
175 => 0x316E8EEF,
176 => 0x4669BE79,
177 => 0xCB61B38C,
178 => 0xBC66831A,
179 => 0x256FD2A0,
180 => 0x5268E236,
181 => 0xCC0C7795,
182 => 0xBB0B4703,
183 => 0x220216B9,
184 => 0x5505262F,
185 => 0xC5BA3BBE,
186 => 0xB2BD0B28,
187 => 0x2BB45A92,
188 => 0x5CB36A04,
189 => 0xC2D7FFA7,
190 => 0xB5D0CF31,
191 => 0x2CD99E8B,
192 => 0x5BDEAE1D,
193 => 0x9B64C2B0,
194 => 0xEC63F226,
195 => 0x756AA39C,
196 => 0x026D930A,
197 => 0x9C0906A9,
198 => 0xEB0E363F,
199 => 0x72076785,
200 => 0x05005713,
201 => 0x95BF4A82,
202 => 0xE2B87A14,
203 => 0x7BB12BAE,
204 => 0x0CB61B38,
205 => 0x92D28E9B,
206 => 0xE5D5BE0D,
207 => 0x7CDCEFB7,
208 => 0x0BDBDF21,
209 => 0x86D3D2D4,
210 => 0xF1D4E242,
211 => 0x68DDB3F8,
212 => 0x1FDA836E,
213 => 0x81BE16CD,
214 => 0xF6B9265B,
215 => 0x6FB077E1,
216 => 0x18B74777,
217 => 0x88085AE6,
218 => 0xFF0F6A70,
219 => 0x66063BCA,
220 => 0x11010B5C,
221 => 0x8F659EFF,
222 => 0xF862AE69,
223 => 0x616BFFD3,
224 => 0x166CCF45,
225 => 0xA00AE278,
226 => 0xD70DD2EE,
227 => 0x4E048354,
228 => 0x3903B3C2,
229 => 0xA7672661,
230 => 0xD06016F7,
231 => 0x4969474D,
232 => 0x3E6E77DB,
233 => 0xAED16A4A,
234 => 0xD9D65ADC,
235 => 0x40DF0B66,
236 => 0x37D83BF0,
237 => 0xA9BCAE53,
238 => 0xDEBB9EC5,
239 => 0x47B2CF7F,
240 => 0x30B5FFE9,
241 => 0xBDBDF21C,
242 => 0xCABAC28A,
243 => 0x53B39330,
244 => 0x24B4A3A6,
245 => 0xBAD03605,
246 => 0xCDD70693,
247 => 0x54DE5729,
248 => 0x23D967BF,
249 => 0xB3667A2E,
250 => 0xC4614AB8,
251 => 0x5D681B02,
252 => 0x2A6F2B94,
253 => 0xB40BBE37,
254 => 0xC30C8EA1,
255 => 0x5A05DF1B,
256 => 0x2D02EF8D,
];
$xorTableHex = [
"00" => 0x0,
"01" => 0x77073096,
"02" => 0xEE0E612C,
"03" => 0x990951BA,
"04" => 0x076DC419,
"05" => 0x706AF48F,
"06" => 0xE963A535,
"07" => 0x9E6495A3,
"08" => 0x0EDB8832,
"09" => 0x79DCB8A4,
"0A" => 0xE0D5E91E,
"0B" => 0x97D2D988,
"0C" => 0x09B64C2B,
"0D" => 0x7EB17CBD,
"0E" => 0xE7B82D07,
"0F" => 0x90BF1D91,
"10" => 0x1DB71064,
"11" => 0x6AB020F2,
"12" => 0xF3B97148,
"13" => 0x84BE41DE,
"14" => 0x1ADAD47D,
"15" => 0x6DDDE4EB,
"16" => 0xF4D4B551,
"17" => 0x83D385C7,
"18" => 0x136C9856,
"19" => 0x646BA8C0,
"1A" => 0xFD62F97A,
"1B" => 0x8A65C9EC,
"1C" => 0x14015C4F,
"1D" => 0x63066CD9,
"1E" => 0xFA0F3D63,
"1F" => 0x8D080DF5,
"20" => 0x3B6E20C8,
"21" => 0x4C69105E,
"22" => 0xD56041E4,
"23" => 0xA2677172,
"24" => 0x3C03E4D1,
"25" => 0x4B04D447,
"26" => 0xD20D85FD,
"27" => 0xA50AB56B,
"28" => 0x35B5A8FA,
"29" => 0x42B2986C,
"2A" => 0xDBBBC9D6,
"2B" => 0xACBCF940,
"2C" => 0x32D86CE3,
"2D" => 0x45DF5C75,
"2E" => 0xDCD60DCF,
"2F" => 0xABD13D59,
"30" => 0x26D930AC,
"31" => 0x51DE003A,
"32" => 0xC8D75180,
"33" => 0xBFD06116,
"34" => 0x21B4F4B5,
"35" => 0x56B3C423,
"36" => 0xCFBA9599,
"37" => 0xB8BDA50F,
"38" => 0x2802B89E,
"39" => 0x5F058808,
"3A" => 0xC60CD9B2,
"3B" => 0xB10BE924,
"3C" => 0x2F6F7C87,
"3D" => 0x58684C11,
"3E" => 0xC1611DAB,
"3F" => 0xB6662D3D,
"40" => 0x76DC4190,
"41" => 0x01DB7106,
"42" => 0x98D220BC,
"43" => 0xEFD5102A,
"44" => 0x71B18589,
"45" => 0x06B6B51F,
"46" => 0x9FBFE4A5,
"47" => 0xE8B8D433,
"48" => 0x7807C9A2,
"49" => 0x0F00F934,
"4A" => 0x9609A88E,
"4B" => 0xE10E9818,
"4C" => 0x7F6A0DBB,
"4D" => 0x086D3D2D,
"4E" => 0x91646C97,
"4F" => 0xE6635C01,
"50" => 0x6B6B51F4,
"51" => 0x1C6C6162,
"52" => 0x856530D8,
"53" => 0xF262004E,
"54" => 0x6C0695ED,
"55" => 0x1B01A57B,
"56" => 0x8208F4C1,
"57" => 0xF50FC457,
"58" => 0x65B0D9C6,
"59" => 0x12B7E950,
"5A" => 0x8BBEB8EA,
"5B" => 0xFCB9887C,
"5C" => 0x62DD1DDF,
"5D" => 0x15DA2D49,
"5E" => 0x8CD37CF3,
"5F" => 0xFBD44C65,
"60" => 0x4DB26158,
"61" => 0x3AB551CE,
"62" => 0xA3BC0074,
"63" => 0xD4BB30E2,
"64" => 0x4ADFA541,
"65" => 0x3DD895D7,
"66" => 0xA4D1C46D,
"67" => 0xD3D6F4FB,
"68" => 0x4369E96A,
"69" => 0x346ED9FC,
"6A" => 0xAD678846,
"6B" => 0xDA60B8D0,
"6C" => 0x44042D73,
"6D" => 0x33031DE5,
"6E" => 0xAA0A4C5F,
"6F" => 0xDD0D7CC9,
"70" => 0x5005713C,
"71" => 0x270241AA,
"72" => 0xBE0B1010,
"73" => 0xC90C2086,
"74" => 0x5768B525,
"75" => 0x206F85B3,
"76" => 0xB966D409,
"77" => 0xCE61E49F,
"78" => 0x5EDEF90E,
"79" => 0x29D9C998,
"7A" => 0xB0D09822,
"7B" => 0xC7D7A8B4,
"7C" => 0x59B33D17,
"7D" => 0x2EB40D81,
"7E" => 0xB7BD5C3B,
"7F" => 0xC0BA6CAD,
"80" => 0xEDB88320,
"81" => 0x9ABFB3B6,
"82" => 0x03B6E20C,
"83" => 0x74B1D29A,
"84" => 0xEAD54739,
"85" => 0x9DD277AF,
"86" => 0x04DB2615,
"87" => 0x73DC1683,
"88" => 0xE3630B12,
"89" => 0x94643B84,
"8A" => 0x0D6D6A3E,
"8B" => 0x7A6A5AA8,
"8C" => 0xE40ECF0B,
"8D" => 0x9309FF9D,
"8E" => 0x0A00AE27,
"8F" => 0x7D079EB1,
"90" => 0xF00F9344,
"91" => 0x8708A3D2,
"92" => 0x1E01F268,
"93" => 0x6906C2FE,
"94" => 0xF762575D,
"95" => 0x806567CB,
"96" => 0x196C3671,
"97" => 0x6E6B06E7,
"98" => 0xFED41B76,
"99" => 0x89D32BE0,
"9A" => 0x10DA7A5A,
"9B" => 0x67DD4ACC,
"9C" => 0xF9B9DF6F,
"9D" => 0x8EBEEFF9,
"9E" => 0x17B7BE43,
"9F" => 0x60B08ED5,
"A0" => 0xD6D6A3E8,
"A1" => 0xA1D1937E,
"A2" => 0x38D8C2C4,
"A3" => 0x4FDFF252,
"A4" => 0xD1BB67F1,
"A5" => 0xA6BC5767,
"A6" => 0x3FB506DD,
"A7" => 0x48B2364B,
"A8" => 0xD80D2BDA,
"A9" => 0xAF0A1B4C,
"AA" => 0x36034AF6,
"AB" => 0x41047A60,
"AC" => 0xDF60EFC3,
"AD" => 0xA867DF55,
"AE" => 0x316E8EEF,
"AF" => 0x4669BE79,
"B0" => 0xCB61B38C,
"B1" => 0xBC66831A,
"B2" => 0x256FD2A0,
"B3" => 0x5268E236,
"B4" => 0xCC0C7795,
"B5" => 0xBB0B4703,
"B6" => 0x220216B9,
"B7" => 0x5505262F,
"B8" => 0xC5BA3BBE,
"B9" => 0xB2BD0B28,
"BA" => 0x2BB45A92,
"BB" => 0x5CB36A04,
"BC" => 0xC2D7FFA7,
"BD" => 0xB5D0CF31,
"BE" => 0x2CD99E8B,
"BF" => 0x5BDEAE1D,
"C0" => 0x9B64C2B0,
"C1" => 0xEC63F226,
"C2" => 0x756AA39C,
"C3" => 0x026D930A,
"C4" => 0x9C0906A9,
"C5" => 0xEB0E363F,
"C6" => 0x72076785,
"C7" => 0x05005713,
"C8" => 0x95BF4A82,
"C9" => 0xE2B87A14,
"CA" => 0x7BB12BAE,
"CB" => 0x0CB61B38,
"CC" => 0x92D28E9B,
"CD" => 0xE5D5BE0D,
"CE" => 0x7CDCEFB7,
"CF" => 0x0BDBDF21,
"D0" => 0x86D3D2D4,
"D1" => 0xF1D4E242,
"D2" => 0x68DDB3F8,
"D3" => 0x1FDA836E,
"D4" => 0x81BE16CD,
"D5" => 0xF6B9265B,
"D6" => 0x6FB077E1,
"D7" => 0x18B74777,
"D8" => 0x88085AE6,
"D9" => 0xFF0F6A70,
"DA" => 0x66063BCA,
"DB" => 0x11010B5C,
"DC" => 0x8F659EFF,
"DD" => 0xF862AE69,
"DE" => 0x616BFFD3,
"DF" => 0x166CCF45,
"E0" => 0xA00AE278,
"E1" => 0xD70DD2EE,
"E2" => 0x4E048354,
"E3" => 0x3903B3C2,
"E4" => 0xA7672661,
"E5" => 0xD06016F7,
"E6" => 0x4969474D,
"E7" => 0x3E6E77DB,
"E8" => 0xAED16A4A,
"E9" => 0xD9D65ADC,
"EA" => 0x40DF0B66,
"EB" => 0x37D83BF0,
"EC" => 0xA9BCAE53,
"ED" => 0xDEBB9EC5,
"EE" => 0x47B2CF7F,
"EF" => 0x30B5FFE9,
"F0" => 0xBDBDF21C,
"F1" => 0xCABAC28A,
"F2" => 0x53B39330,
"F3" => 0x24B4A3A6,
"F4" => 0xBAD03605,
"F5" => 0xCDD70693,
"F6" => 0x54DE5729,
"F7" => 0x23D967BF,
"F8" => 0xB3667A2E,
"F9" => 0xC4614AB8,
"FA" => 0x5D681B02,
"FB" => 0x2A6F2B94,
"FC" => 0xB40BBE37,
"FD" => 0xC30C8EA1,
"FE" => 0x5A05DF1B,
"FF" => 0x2D02EF8D
];