質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

2676閲覧

C⇒pythonへのコンバート方法

ojioji

総合スコア11

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/02/07 06:00

編集2018/02/07 07:55

前提・実現したいこと

Pyhton初心者です。
該当ソースは、C言語で作成されているのですが、pythonへコンバートした際の記述が不明な為、ご教授をお願いいたします。
主に「fread( &buf, sizeof( unsigned short int ), 1, fp )」の個所と多次元配列の「buf」の取り扱いがpyton上
どのように記述するのか理解できておりません。

該当のソースコード

int width = 画像サイズ(幅); int hight = 画像サイズ(高さ); int filecount = ファイル件数; float *tmp = NULL; float ***tmp2 = NULL FILE *fp; char fpath = イメージ画像のパス unsigned short int buf; //tmp 用メモリの確保 tmp = (float*)calloc( width * hight, sizeof( float ) ); //tmp2 用メモリの確保 (*tmp2) = (float***)calloc( filecount, sizeof( float ** ) ); for( i = 0 ; i < filecount ; i++ ){ (*tmp2)[i] = (float**)calloc( lines, sizeof( float * ) ); for( j = 0 ; j < hight ; j++ ){ (*tmp2)[i][j] = (float*)calloc( width, sizeof( float ) ); } } for( i = 0 ; i < filecount ; i++ ){ fp = fopen( fpath, "rb" ); for( j = 0 ; j < hight ; j++ ){ for( k = 0 ; k < width ; k++ ){ fread( &buf, sizeof( unsigned short int ), 1, fp ); if( buf != 0 ){ tmp[j*width+k] = (float)( 10.0 * log10( (double)(buf*buf) ) 83.0 ); } } } for( j = 0 ; j < (3/2) ; j++ ){ for( k = 0 ; k < width ; k++ ){ (*tmp2)[i][j][k] = tmp[j*width+k]; } } }

補足情報(FW/ツールのバージョンなど)

python 3.x

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

「fread( &buf, sizeof( unsigned short int ), 1, fp )」の個所

  • open('~', 'rb')にてバイナリモードで開く
  • read(4)で必要なバイト数だけバイナリのまま読み込む
  • struct.unpack('<f', dat)でバイナリからエンディアン含め必要な型に変換する

型変換の詳細はstruct.unpackを参照ください。

Python

1import struct 2 3# float値 1.0 を書込み 4with open( 'in.dat', 'wb') as f: # b=バイナリモード 5 dat = struct.pack('<f', 1.0) # float LE -> bytes 6 f.write( dat) 7 8# 読込 9with open( 'in.dat', 'rb') as f: # b=バイナリモード 10 dat = f.read(4) # 4byte読込 11 print(type(dat),dat) # <class 'bytes'> b'\x00\x00\x80?' 12 13 dat = struct.unpack('<f', dat) # bytes -> float LE 14 print(type(dat), dat) # <class 'tuple'> (1.0,) 15 16 dat = dat[0] 17 print(type(dat), dat) # <class 'float'> 1.0

読み込んだ結果からどのような(多次元)配列を構築すべきかは元ソースの処理によるので回答は控えます。
(そもそも元ソースでもbufを多次元配列として扱っているようには見えません)

投稿2018/02/07 06:27

編集2018/02/07 06:33
can110

総合スコア38233

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ojioji

2018/02/07 06:55

ご回答ありがとうございます。 転記したソースに誤りがございました。 その為、多次元配列に関するソースが抜け落ちておりました。 ただ、ほかの個所につきましては、参考にさせていただきます。 ありがとうございました。 今一度、質問をし直させていただきます。
ojioji

2018/02/07 09:27

もう1点確認させていただけますでしょうか? バイナリモードでファイルを読み込む際、4バイトずつ読み込むにはどうしたらよいのでしょうか? 素人な質問で申し訳ございません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問