Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   [решено] Редактирование java *.class в php (http://forum.oszone.net/showthread.php?t=234086)

slonick2012@vk 05-05-2012 12:26 1910926

Редактирование java *.class в php
 
Помогите, мне нужно открыть один файл с расширением *.class в нем изменить одно значение и сохранить его. Кто знает какие нужны функции и вообще что за код получится.

slonick2012@vk 05-05-2012 12:46 1910932

Вот пример

ferget 05-05-2012 12:55 1910935

так вам надо изменить значение или сделать как в примере?

slonick2012@vk 05-05-2012 12:57 1910938

ferget, Ну в примере изменяет значение и генерирует новый файл class, дайте код хоть как в примере, а я дальше сам как-то разберусь.

slonick2012@vk 06-05-2012 10:59 1911382

Ну что никто не знает?

slonick2012@vk 07-05-2012 12:57 1911867

:help:

ferget 07-05-2012 13:01 1911870

а вам обязательно на php?

slonick2012@vk 07-05-2012 13:29 1911884

ferget, да, мне для онлайн конструктора одного приложения

ferget 07-05-2012 13:39 1911887

функция pack http://php.su/functions/?pack

упаковать в строку и записать в файл

slonick2012@vk 07-05-2012 14:09 1911907

ferget, эту функцию я видел, но как использовать я не знаю, можете если я вам дам файл class Вы мне код напишете для изменения одного значения?

ferget 07-05-2012 14:55 1911927

выкладывайте файл, посмотрю

slonick2012@vk 07-05-2012 15:01 1911929

Вложений: 1
Вот файл

ferget 08-05-2012 05:29 1912306

вот простейший вариант

Код:

<?php
        $fh = fopen("cf81243.class", "rb");
        $data = fread($fh, 98);
        fseek($fh, 101);
        $data1 = fread($fh, filesize("cf81243.class"));
        fclose($fh);
       
        $ms='FFAA00';
        $binarydata = pack("H" . 6, $ms);
       
        $fdata=$data.$binarydata.$data1;
       
        $fp = fopen("cf.class", "a");
        fwrite($fp,$fdata);
        fclose($fp);
?>


slonick2012@vk 08-05-2012 09:43 1912339

Код:

$ms='FFAA00';
Это значение которое заменяет?

ferget 08-05-2012 13:52 1912471

Цитата:

Цитата slonick2012@vk
Это значение которое заменяет? »

Да

в .html
Код:

<input type=text size=6 name=b>
в .php
Код:

$ms=$_POST['b'];

slonick2012@vk 08-05-2012 16:30 1912565

Так там много значений, как оно поймет что надо изменить определенное значение?

slonick2012@vk 08-05-2012 16:46 1912574

Для выполнения данного скрипта не хватает памяти, что делать? Тестировал его на денвере

ferget 08-05-2012 16:46 1912575

не совсем понятен вопрос

в html текстовое поле на 6 символов

php скрипт принимает текст и создает файл

slonick2012@vk 08-05-2012 16:58 1912580

Да а как она в тексте заменить мне нужное значение? После сохранения файл не работает

ferget 08-05-2012 17:18 1912591

Вложений: 1
я тоже проверяю на денвере вроде работает

вот html и php файлы

slonick2012@vk 08-05-2012 17:42 1912609

А как узнать количество отступов до того или иного значения? там ведь ничего не понятно, а то я вижу в коде Вы использовали перейти к 101 символу

ferget 08-05-2012 18:06 1912626

Цитата:

Цитата slonick2012@vk
в коде Вы использовали перейти к 101 символу »

сперва считываются 98 байт, затем от 102 до конца файла, при записи не достающие байты заменяются

Цитата:

Цитата slonick2012@vk
А как узнать количество отступов до того или иного значения »

в данном случае я взял два файла с того сайта и в hex-редакторе посмотрел где различаются

еще можете попробовать программу artmoney

slonick2012@vk 08-05-2012 20:10 1912693

ferget, огромное тебе человеческое спасибо за код, все работает вот только приложение после замены файла не работает

ferget, все работает, в папку просто положил не рабочий файл class, у меня последний вопрос как ты считал порядковый номер символа в hex-редакторе?

ferget 08-05-2012 22:05 1912768

Вложений: 1
вот, например, winhex 55-ый байт, счет должен быть в десятичной системе

slonick2012@vk 08-05-2012 22:24 1912782

ferget, А как на счет A,B,C,...?

ferget 08-05-2012 22:39 1912793

не понял вопрос

slonick2012@vk 08-05-2012 22:44 1912795

ferget, Ну у меня в winhex значение которое нужно заменить имеет к примеру порядковый номер 1B как его считать?

ferget 08-05-2012 22:55 1912805

кликните мышью в графе offset он переключится в десятичную систему

slonick2012@vk 08-05-2012 23:06 1912810

ferget, Огромное спасибо, теперь можно дальше работать

slonick2012@vk 09-05-2012 00:27 1912843

ferget, Что-то я начудил размер файла увеличился аж на 20кб

slonick2012@vk 09-05-2012 01:09 1912855

Где здесь ошибка?
PHP код:

$cf fopen("cf.class""rb");
    
$data fread($cf17);
fseek($cf20);
    
$data2 fread($cf22);
fseek($cf25);
    
$data3 fread($cf27);
fseek($cf30);
    
$data4 fread($cf32);
fseek($cf35);
    
$data5 fread($cf37);
fseek($cf40);
    
$data6 fread($cf52);
fseek($cf55);
    
$data7 fread($cf97);
fseek($cf100);
    
$data8 fread($cffilesize("cf.class"));
fclose($cf); 


slonick2012@vk 09-05-2012 02:44 1912879

ferget, Уже сделал

ferget 09-05-2012 03:16 1912883

тут слишком много раз читается файл, причем 4 раза считывается одно и тоже число 03 00, лучше оставить два чтения файла, а остальное самому записать в переменные

slonick2012@vk 09-05-2012 03:47 1912886

ferget, Вопрос, как в файл класс записать например значение "123456"? Это уже не hex

ferget, Но текст нужно как-то запаковать что бы все работало

slonick2012@vk 09-05-2012 04:07 1912888

ferget, Так 123456 я смог вставить, а вот символы №; и чтоб работало не могу

ferget 09-05-2012 04:34 1912891

Цитата:

Цитата slonick2012@vk
а вот символы №; и чтоб работало не могу »

подробнее опишите

slonick2012@vk 09-05-2012 12:11 1912985

Вложений: 1
Давайте я вам дам файл класс другой в нем будет слово "this", вот его и нужно будет заменить на какие-то символы ну к примеру на "®*©«»¶¦¬°І±^·µ™ЇҐ†Љџ"

ferget 09-05-2012 20:01 1913167

файл бинарный и this на самом деле это 74 69 69 73
и чтобы заменить, надо посмотреть как эта строка "®*©«»¶¦¬°І±^·µ™ЇҐ†Љџ" выглядит в hex-редакторе

slonick2012@vk 09-05-2012 20:12 1913171

Так это пример символов, а если будут другие... короче это реально что бы их скрипт паковал ну также как значения цветов или нет?

slonick2012@vk 09-05-2012 23:55 1913194

ferget, Все есть у меня нужный код. Спасибо за помощь!

slonick2012@vk 10-05-2012 01:34 1913210

ferget, :( Нет код немного не работает, Не правильно записывает значение, в hex оно верно, а в utf-8 нет. вот код

PHP код:

<?php
$mod 
$_GET["mod"];
switch(
$mod) {
case 
false:
default:
echo 
'
<form action="?mod=result1" method="post">
<input name="c1" value="1" type="checkbox">
<input size="6" name="bb1" type="text"><br><br>
<input style="margin-top: 5px;" value="дальше »" type="submit"><br>
</form>
</body></html>'
;

break;
case 
result1:

function 
ascii2hex($ascii) {
if (
$_POST['c1'] == '')
$bb1 'ав';
if (
$_POST['c1'] == '1')
$bb1 $_POST['bb1'];
$ascii $bb1;
$hex '';
for (
$i 0$i strlen($ascii); $i++) {
$byte strtoupper(dechex(ord($ascii{$i})));
$byte str_repeat('0'strlen($byte)).$byte;
$hex.=$byte." ";
}
return 
$hex;
}
$source_column2 ascii2hex($source_column1);
$patterns[0] = "/ /";
$replacements[0] = "";
$binary preg_replace($patterns$replacements$source_column2);
echo 
$binary;

$fd fopen("fd.class""rb");
    
$data fread($fd316);
fseek($fd317);
    
$data2 fread($fdfilesize("fd.class"));
fclose($fd);

$bb1 $_POST['bb1'];
$test strlen($bb1);
$test1 $test/2;
if (
$test1 <= 9)
{
$zero '0';
$test2 $zero.$test1;}
else
{
$test2 $test1;}
$binary2 pack("H" 2$test2);
$binary1 pack("H" $test$binary);

$rand "class/fd.class";
$fd fopen("$rand""w");
$fdata $data.$binary2.$binary1.$data2;
fwrite($fd,$fdata);
fclose($fd);
break;}
?>

Английские буквы записываются нормально

ferget 10-05-2012 05:32 1913231

подробнее опишите, какие именно значения вы записываете, что получается, что должно получится

slonick2012@vk 10-05-2012 08:46 1913270

ferget, Ну вот когда записываю русский символ или какой-то иной символ (№%?...), в hex смотрю там все нормально, закидываю этот файл в игру, там выдает ошибку "Bad utf8 string"

ferget 10-05-2012 09:43 1913285

проверьте как записывается

вот знак № в utf8 EF BB BF E2 84 96

slonick2012@vk 10-05-2012 12:29 1913353

А в hex № B9, вот как его записать чтобы работало? Если просто В9 записать то ошибка.

slonick2012@vk 10-05-2012 12:55 1913372

ferget, Вот в java classe он записывается иначе вот код для перекодирования, а мне получается нужен обратный код, сможете сделать?

$s='\u041f\u0440\u0435\u0432\u0435\u0434 \u041a\u0440\u0435\u0432\u0435\u0434\u043a\u043e!';

//чтобы перекодировать в нормальный вид можно пошаманить вот так
echo preg_replace('#\\\\u([0-9a-f]{4})#se','iconv("UTF-16BE","UTF-8",pack("H4","$1"))',$s);

slonick2012@vk 10-05-2012 13:31 1913394

ferget, Символ № что бы работал нужно записать так в„– , не знаете как его так перекодировать?

ferget, Уже сделал скрипт конечно большой получился.


Время: 09:23.

Время: 09:23.
© OSzone.net 2001-