Perl から Lua :バイナリファイルの出力

2017-01-02 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
昨年(2016-12-18)の記事「Perl から Lua :バイナリファイルの入力」で終了かと思ったが、・・・・・

かれこれ3年ほど前に、“Perl”で書いていたものがあった。

それらも、序でに
Lua”と云っても、“GSL Shell”に移植しようとした。

ところが、
気になる幾つかの処理部分がある。

先ず、1つ目。

バイナリファイルの出力について。

書き出したいファイルは、C言語で読み込むためのもの。
つまり、4バイトintegerデータ配列そのまま。


当時の Perl でのコードは:
# ・・・・・
# ・・・・・
@TBL = ( <整数値のリスト> );
$n = $#TBL; # $n == 要素数 - 1
open ( OT, ">".$IT ); binmode OT;
$w = pack "S*", @TBL; # S とは、2B unsighed int
printf OT $w;
close ( OT );
# ・・・・・
# ・・・・・
の様にコーディングしていた。
ここで、$ITつまりファイル名は、事前に定義済み。


それで、Lua系で書くには?

ffi.C.fwrite を使う?
つまり、
ファイルへ size バイトのデータを n 個書込:
  size_t fwrite( void *buf, size_t size, size_t n, FILE *fp );
を使う。

と云うことで以下:
-- ・・・・・
-- ・・・・・
ffi.cdef[[
void* fopen( const char* fname, const char* type );
int fwrite ( void* buf, int size, int n, void* fp );
int fclose( void* fp );
]]
TBL = { <整数値のリスト> }
n = #TBL
buf = ffi.new( 'int32_t[?]', n )
for k=1,n do buf[k-1]=TBL[k] end

OT = ffi.C.fopen( 'IT', 'wb' )
fsize = ffi.C.fwrite( buf, 4, n, OT )
rtnCD = ffi.C.fclose( OT )
-- ・・・・・
-- ・・・・・
で行ける。


でも、
Perl から Lua :バイナリファイルの入力」と同じように、
ffi.C.fwrite を使わ無いで行けないか?


できますね。
-- ・・・・・
-- ・・・・・
TBL = { <整数値のリスト> }
n = #TBL
buf = ffi.new( 'int32_t[?]', n )
for k=1,n do buf[k-1]=TBL[k] end

bstr = string.rep( 'a', n )
ffi.copy( bstr, buf, n*4 )

OT = io.open( 'IT', 'wb' )
OT:write( bstr )
OT:close()
-- ・・・・・
-- ・・・・・
これで行ける。


でも、ffi.copy を使わない方法もあった:
-- ・・・・・
-- ・・・・・
TBL = { <整数値のリスト> }
n = #TBL
buf = ffi.new( 'int32_t[?]', n )
for k=1,n do buf[k-1]=TBL[k] end

OT = io.open( 'IT', 'wb' )
OT:write( ffi.string( buf, n*4 ) ) -- この変換でOK
OT:close()
-- ・・・・・
-- ・・・・・
これで、完成。


本日はここまで。


“Perl から Lua ( GSL Shell ) への移植”準備その2は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


161204
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
04 | 2017/05 | 06
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク