[過去ログ] Perlについての質問箱 64箱目 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
504: 2020/07/07(火)19:01 ID:e1WbjzO/(2/2) AAS
俺様
505(3): 2020/07/23(木)01:04 ID:2kWEZYuR(1/3) AAS
___________________________________________
/media/xxx/DVD_HDVR/HDVR_SOB/*.SRO
というのが動画本体で、
SROファイルの構造は
000000-00007F 東芝ヘッダ
000080-007FFF (データA)
008000-00807F 東芝ヘッダ
008080-00FFFF (データB)
010000-01007F 東芝ヘッダ
010080-01FFFF (データC)
となっていて、東芝ヘッダからみたオフセット0x1C番地にある0x40値を=>0x00に書き換えるそうです。
東芝ヘッダは1つのファイルに複数ある(?)そうで、それらすべてを書き換える必要があるようです
↑
これをperlスクリプトでお願いします
506(1): 2020/07/23(木)06:45 ID:6LXR6fOg(1) AAS
binmodeで開いて、substr
507: 2020/07/23(木)19:03 ID:2kWEZYuR(2/3) AAS
>>506
ありがとう
素人過ぎてわかんないけど
508: 2020/07/23(木)19:09 ID:NaEhWCW1(1) AAS
コードそのものを書いてくれとさ
509(2): 2020/07/23(木)19:25 ID:2kWEZYuR(3/3) AAS
同じような目的の別のスクリプトです
これに近いイメージでしょうか
(全文書くとブロックされる)
_________________________________________________________
HR_MANGR.IFOのコピー禁止フラグ解除は、
0x20 0x2C 0x23のシーケンスを0x20 0x24 0x23 に変更
perlスクリプトの例は以下のとおり。
# freeifo.pl
# HR_MANGR.IFOの変換
use strict;
use warnings;
my $infile = "HR_MANGR.IFO";
my $buf;
my $sTarget = " ,#"; # 0x20 0x2C 0x23
# ファイルのオープン
# バイナリモードに変更
binmode INFILE;
binmode OUTFILE;
my $sizIFO = -s $infile;
# IFOファイルを読み込み
# 0x20 0x2C 0x23 の並びがあれば、0x20 0x24 0x23 に置き換え
#他にあれば継続、無ければ終了
# ファイルのクローズ
close INFILE;
close OUTFILE;
510: 2020/07/24(金)04:55 ID:6ZonvnML(1) AAS
そうそう。そんな感じ。
まあ頑張って。
511(3): 2020/07/24(金)09:07 ID:So4dssPK(1/4) AAS
書き換える番地は、N は、0 以上で、以下の法則か?
0x8000 × N + ( 0x80 + 0x1C )
つまり、ヘッダは必ず、0x8000 毎にあるのか?
512(1): 2020/07/24(金)11:24 ID:JRbdBOQM(1/10) AAS
>>511
レスありがとうございます
________________________________________________
SROファイルの書き換え
000000-00007F 東芝ヘッダ
000080-007FFF (データA)
008000-00807F 東芝ヘッダ
008080-00FFFF (データB)
010000-01007F 東芝ヘッダ
010080-01FFFF (データC)
というふうに、0x8000バイトで1セットとなっている。
東芝ヘッダとは、0x80バイトからなるデータブロック。途中に## Toshiba 〜という文字列を含んでいる
東芝ヘッダのコピー禁止フラグ(CPP)のあるオフセット0x1Cを 0x40 ⇒ 0x00 に修正。
513(1): 2020/07/24(金)11:37 ID:nuOKXnku(1) AAS
オレなら、バイナリーエディタの置換機能を使うと思うが。
514(1): 2020/07/24(金)11:40 ID:61Z/1/Bp(1/2) AAS
数が多いとツール作った方が早い
手動でやってもツール作っても時間同じなら、ツール作った方がいい
仕事では、ツール作ったせいで余計に時間かかってもツール作る
515(1): 2020/07/24(金)11:53 ID:JRbdBOQM(2/10) AAS
>>513
データが大きいのでLinuxのバイナリエディタでは上手く行かないのです
516: 2020/07/24(金)12:54 ID:JRbdBOQM(3/10) AAS
画像リンク
この文字列が一定間隔で現れます
データが大きいので>>514さんの言うとおりツール(スクリプト)で処理したいのです
517(1): 2020/07/24(金)15:39 ID:EkE5sKTE(1/3) AAS
perl -e "binmode STDIN; binmode STDOUT; while (read STDIN, $_, 0x8000) { substr $_, 0x1c, 1, 0; print }" < IN > OUT
これが最短?
518: 2020/07/24(金)15:58 ID:JRbdBOQM(4/10) AAS
>>517
レスありがとうございます
泣きそうです(解らなすぎて)
>>509のスクリプトはバイナリ修正したコピーファイルを作成するものでした
小さなファイルなので問題ないのですが、目的の対象ファイルは10GB~20GBもあるものなのでマネ出来ません
519: 2020/07/24(金)16:06 ID:JRbdBOQM(5/10) AAS
>>509の全文です
画像リンク
後出しのクセが強すぎすいません
520: 2020/07/24(金)16:07 ID:UzZpGBU/(1) AAS
>>515
なるほどね。しかし、perlが扱えるデータ量にも、よく解らない限界があって、
巨大なデータを突っ込むと勝手に途中で切られたりするみたいだよ。
巨大なデータを扱うなら、seek関数みたいな低水準な手法を使う必要があるかもしれない。
521(1): 2020/07/24(金)16:48 ID:EkE5sKTE(2/3) AAS
直接書き換えたいならこんなとか?
perl -e 'open F, "+< IN"; binmode F; while ($l = read F, $_, 0x8000) { substr $_, 0x1c, 1, "\0";
seek F, -$l, 1; print F }'
522: 2020/07/24(金)17:06 ID:61Z/1/Bp(2/2) AAS
別に短く書くコンテストではない
523(1): 2020/07/24(金)17:06 ID:JRbdBOQM(6/10) AAS
>>521
ありがとうございます
Fはファイル名でよろしいでしょうか?(素人でごめんなさい)
Can't find string terminator "'" anywhere before EOF at -e line 1.
となります
524: 2020/07/24(金)17:29 ID:JRbdBOQM(7/10) AAS
サンプルです
外部リンク[SRO]:www.dropbox.com
もしよろしければ暇つぶしに、ご指南いただけませんか?
(もう、いただいてますけど)
525: 2020/07/24(金)17:49 ID:JRbdBOQM(8/10) AAS
よく考えたらダメだったw
526: 2020/07/24(金)19:45 ID:lCl1FARv(1) AAS
GBレベルのファイルがオンメモリで処理できるわけないだろ。w
527: 2020/07/24(金)20:07 ID:iJ+2fZSI(1) AAS
メモリが1TBあればヘーキヘーキ
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
上下前次1-新書関写板覧索設栞歴
あと 469 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.019s