[過去ログ] Perlについての質問箱 64箱目 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
528: 2020/07/24(金)20:38 ID:So4dssPK(2/4) AAS
Stream 処理なら、バッファサイズ分のデータを、読んでは捨ててを繰り返すから、
必要なメモリサイズは、バッファサイズ分だけ
それか、seek みたいに、その番地をシークして、そこだけ書き換える
529: 511 2020/07/24(金)21:01 ID:So4dssPK(3/4) AAS
0x8000 は、32,768 バイトだから、32 KiB。
(ただし、Kib は、1,000 倍ではなく、1,024 倍)
32 KiB * 32 個 = 1 MiB
1 GiB なら、 32個 * 1,024 = 32,768個
10GiB なら、0x8000サイズのブロックが、327,680個もあるの?
データ部分は固定サイズなの?
変動サイズで、そのサイズがヘッダ内に記録されているとかじゃないの?
530(6): 2020/07/24(金)21:50 ID:EkE5sKTE(3/3) AAS
まーだやってたのか
>>523 で
perl -e 'open F, "+< ファイル名"; binmode F; while ($l = read F, $_, 0x8000) { substr $_, 0x1c, 1, "\0"; seek F, -$l, 1; print F }'
がエラーになったのは Windows のコマンドプロンプトで試したんだろ
コマンドプロンプトでは ' でなく " を使ってこう
perl -e "open F, '+< ファイル名'; binmode F; while ($l = read F, $_, 0x8000) { substr $_, 0x1c, 1, qq/\0/; seek F, -$l, 1; print F }"
もちろん read や print は流れで残してただけでまったく必要ないから
perl -e "open F, q/+< ファイル名/; binmode F; seek F, 0x1c, 0; while (! eof F) { seek F, 0, 1; print F qq/\0/; seek F, 0x7fff, 1 }"
で十分なのは言うまでもない
コマンドラインで書き捨てじゃないならperl7で不可予定の F じゃなくて $fh にするかな
531: 511 2020/07/24(金)22:51 ID:So4dssPK(4/4) AAS
くれぐれも、データのバックアップを取っておいてから、実験しろよ。
もし、プログラムが間違っていたら、回復できないから
そもそも、他人のプログラムの意味が分からないのに、
それをそのまま実行するのは、非常に危険!
532(23): 532 2020/07/24(金)23:35 ID:Z8MDOpZc(1/4) AAS
Binary fileをupdateモードでopenして
目的の位置にseekしpackで元のファイルの内容を直接書き換える方法なら
外部リンク[htm]:docstore.mik.ua
533: 532 2020/07/24(金)23:36 ID:Z8MDOpZc(2/4) AAS
>>530 と内容が被った…orz
534: 532 2020/07/24(金)23:40 ID:Z8MDOpZc(3/4) AAS
この辺調べてやってくだされぃ
外部リンク:www.google.co.jp
535: 532 2020/07/24(金)23:45 ID:Z8MDOpZc(4/4) AAS
先生ッ、便利そうなモジュール見つけました!
外部リンク:metacpan.org
536: 2020/07/24(金)23:46 ID:JRbdBOQM(9/10) AAS
>>530
検証に時間がかかってしまって返信遅くなりました
できました!! ありがとうございました!
推察の通りコマンドプロンプトでのエラーでした
本命のLinux(Ubuntu)の端末上からも書き換え成功しました
感謝です
ほかの皆様もありがとうございました
不愉快に感じた方も多かったと思います ごめんなさい
ここで「進捗状況表示(%)をさせるにはどうしたらいいですか?」とか聞くと嫌われることは、僕もいい大人なので知っています
537: 2020/07/24(金)23:48 ID:JRbdBOQM(10/10) AAS
>>532
親切にありがとうございます
538(1): 2020/07/25(土)00:54 ID:uhXYZAuD(1) AAS
進捗状況を表示させるには、最初にファイルサイズを取得する。
そして、データを書き換えるたびに、現在のseek 番地を取得して、
現在のseek 番地 × 100 / ファイルサイズ
例えば、300 × 100 / 1,000 = 30 %
539(1): 2020/07/25(土)01:23 ID:c7rlqrmm(1) AAS
>>538
レスありがとうございます
本当にうれしいのですがド素人なので理解出来ないのです
>>530のコマンドラインに絡めるかスクリプトにしていただけると卒倒するほど喜びます
これを機会にperlを勉強したいと(心から)思いますが、今の段階ではこんな図々しいお願いをするしか出来ません
540(1): 2020/07/25(土)02:26 ID:GJL3/5bG(1) AAS
もうええやろ?
541: 2020/07/26(日)01:36 ID:5SabrGL+(1) AAS
>>539
死ねよ
542: 2020/07/26(日)02:35 ID:T0U3lDAz(1) AAS
勉強する気はなしか
やれやれ
543: 2020/07/26(日)08:04 ID:faz+YmuJ(1/2) AAS
進捗表示は、計算自体は簡単だけど、ちゃんと見えるように表示するのが
ちょっと面倒なんだよな
544: 2020/07/26(日)10:44 ID:KWzmTFSY(1) AAS
好きなのを使えばいいよ。
外部リンク:metacpan.org
545: 2020/07/26(日)11:13 ID:faz+YmuJ(2/2) AAS
そんなもんがいちいちあるのか
まあ、凝ったことをするなら共通化はするだろうけど
凝ったことしなくても、どういう頻度で表示するかとかの調整は必要で、
UI特有の機能と関係ない面倒臭さの部分なんだよな
546: 2020/07/26(日)13:26 ID:y3z4IjvW(1) AAS
ターミナルの機能を使いきるなら面倒だろうけど、ただ垂れ流すだけなら簡単やろ。
547: 2020/07/26(日)18:32 ID:hRZi6+cn(1) AAS
>>512
最適化するとすると手順はこんな感じかな。
1. 0x1c バイト読んでそのまま書く。
2. 1バイト読む。読めなかったら 5 へ。読んだ内容が 0x40 なら 0x00 に変えて書く。0x40 でなければそのまま書く。
3. 最大 0x7fff バイト読み、読めたデータをそのまま書く。
4. 2へ。
5. 終わり。
STDIN から読んで STDOUT で書くならこうなる。
read(STDIN, $buf, 0x1c);
print $buf;
while (read(STDIN, $buf, 1)) {
print $buf eq "\x40" ? "\x00" : $buf;
read(STDIN, $buf, 0x7fff);
print $buf;
}
548(2): 2020/07/27(月)00:36 ID:Y15FmTu1(1/3) AAS
>>530さんからの頂き物に、ファイルサイズを取得。。。まではできました(訳:パクれました
みなさんありがとう
し、進捗。。。
----------------------------------------------------------------
open F, "+< ファイル名";
binmode F;
my $filename = "ファイル名";
my $filesize = -s $filename;
print "$filenameのサイズは$filesizeです。\n";
while ($l = read F, $_, 0x8000) { substr $_, 0x1c, 1, "\0"; seek F, -$l, 1; print F }
549: 2020/07/27(月)01:28 ID:KvYX/iYh(1/2) AAS
>>548
いい加減にしろ
550(1): 2020/07/27(月)07:32 ID:X6EMHfht(1/2) AAS
readして変更しないところまでprintするのは無駄なのに
無駄を省けば進捗表示がいらないくらい高速化するだろうに
551: 2020/07/27(月)09:23 ID:HYhflFVx(1/2) AAS
コピーを作っておいて、そのコピーの一部だけ変更して書き戻せば一瞬
信頼性が上がったら、コピーは作らずにオリジナルを変更する
552: 2020/07/27(月)10:25 ID:URSuW3yQ(1) AAS
>>550
ファイルサイズがGBレベルなら、そんなに速くはならんやろ。
553: 2020/07/27(月)17:35 ID:X6EMHfht(2/2) AAS
ていうか >>548 は >>530 を参考にしてるのになんで遅い方を使ってるんだ
554: 2020/07/27(月)18:21 ID:Y15FmTu1(2/3) AAS
呼ばれた気がしたので
約10分のデータ(1.3GB)で比較しました
readあり
real 1m34.485s
user 0m0.888s
sys 0m6.100s
readなし
real 1m5.851s
user 0m0.340s
sys 0m3.563s
USB2.0()でUbuntuにマウントさせた外付けHDD上のデータを直接書き換えています
特殊なフォーマットなのでWindowsでは認識できないのです
555: 2020/07/27(月)19:14 ID:KvYX/iYh(2/2) AAS
DRM解除の片棒担ぐ人達かね
556: 2020/07/27(月)19:33 ID:HYhflFVx(2/2) AAS
なんて大層なDRMだ
557(1): 2020/07/27(月)19:46 ID:Y15FmTu1(3/3) AAS
残念ながら暗号化解除まではされないんです
別の機器にコピーしようとしても「コピープロテクトがなんちゃら。。」と、ちゃんとハネられます
機器内の制限を緩くするためのオフホワイトな作業です
上下前次1-新書関写板覧索設栞歴
あと 445 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.015s