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

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

新規登録して質問してみよう
ただいま回答率
85.53%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

1523閲覧

C/C++でバイナリファイルから特定の部分列の数値を読み出し10進数にする方法

komgiko

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/04/08 16:13

編集2022/04/13 12:11

ビッグインディアン形式のバイナリファイルA.binには、長さが32で2進数の情報が入っていたとします。
例えば01010001 10100100 01000110 10010110というようにです。
この時、a番目からb番目までの並びの数字の列を10進数にしてint型の文字列に入れるにはどうすれば良いでしょうか。
CもしくはC++のコード例を教えていただけると幸いです。
何か足りない情報があればご指摘をお願いします。

追記
上記のa,bはそれぞれ部分列のインデックスの最初(左)と最後(右)で、0始まりとなっています。
私が最終的に行いたいのは、数MB以上のバイナリファイルの読み込みです。
このバイナリファイルには装置が測定測定するごとに120個の0/1の並びが追加されます。1回の測定で追加される要素120の配列中の部分列[62, 80]が、測定量Aを2進数で表記したものになっています。このAを何らかの変数に入れてさらに計算したいと考えています。

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

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

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

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

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

jimbe

2022/04/08 17:54 編集

まず A.bin のバイナリダンプをご提示されては如何でしょうか。 また、「int型の文字列」とは何でしょう。c/c++ での変数の型を教えて下さい。 そして、「例えば」のデータに対し「例えば」 a や b をどんな値にしたら「int型の文字列」の変数にどんな値が入るようにしたいのか、例えで示していただけますか。 最後に、これはどこかから出された課題でしょうか。ご自身ではどこまで出来ているでしょうか
tatsu99

2022/04/08 20:20

a番目というのは左側からですか。それとも、右側からですか。 また、例えば、左側からだとして、一番左側は、0番目ですか。それとも1番目ですか。(0始まりか1始まりかです)
thkana

2022/04/08 22:44

細かいことですが、ビッグ「エンディアン」(大きなインド人ではなく、アドレスの大きい方が表記の終了側、とかそんなような意)なので修正しておいたほうがよいかと思います。
jimbe

2022/04/12 13:56

> このバイナリファイルには装置が測定測定するごとに120個の0/1の並びが追加されます。 その 0/1 というのがビットなのかバイトなのかもはっきりしないのですが、どちらでしょう。
guest

回答4

0

ベストアンサー

このバイナリファイルには装置が測定測定するごとに120個の0/1の並びが追加されます。1回の測定で追加される要素120の配列中の部分列[62, 80]が、測定量Aを2進数で表記したものになっています。このAを何らかの変数に入れてさらに計算したいと考えています。

1回の出力で15バイト単位でファイルに書き込まれると解釈しました。
以下は、ファイルから15バイトを読み込み、その15バイトの領域の開始位置と終了位置を指定して、
値を取り出すサンプルです。開始位置=62、終了位置=80としています。
符号は考慮していません。符号なし整数として扱っています。

C

1#include<stdio.h> 2#include<string.h> 3#define BSIZE (15) 4int getval(unsigned char *buff,int st,int en,unsigned int *uval,char *bits); 5int getbit(unsigned char *buff,int pos); 6int main() 7{ 8 FILE *fp; 9 unsigned char buff[BSIZE]; 10 int ret; 11 unsigned int val; 12 char bits[33]; 13 fp = fopen("A.bin","rb"); 14 if (fp == NULL){ 15 printf("fopen error\n"); 16 return 10; 17 } 18 ret = fread(buff,1,BSIZE,fp); 19 if (ret != BSIZE){ 20 printf("fread error\n"); 21 } 22 fclose(fp); 23 ret = getval(buff,62,80,&val,bits); 24 if (ret == 0){ 25 printf("normal end val = %u bit string=[%s]\n",val,bits); 26 }else{ 27 printf("parameter error\n"); 28 } 29 return 0; 30} 31//buff:バイナリデータバッファ 32//st:開始位置 33//en:終了位置 34//uval:該当位置の値 35//bits:該当位置のビットの並び(文字列) 36//戻り値: 正常終了=0 パラメータエラー=-1 37int getval(unsigned char *buff,int st,int en,unsigned int *uval,char *bits) 38{ 39 char wbits[33]; 40 unsigned wval = 0; 41 memset(wbits,0x00,sizeof(wbits)); 42 int bit; 43 int i; 44 if (st >= BSIZE * 8) return -1; 45 if (en >= BSIZE * 8) return -1; 46 if (st > en) return -1; 47 if ((en - st) > 31) return -1; 48 for (i = st; i <= en; i++){ 49 bit = getbit(buff,i); 50 wval = wval * 2 + bit; 51 wbits[i-st] = bit + 0x30; 52 } 53 *uval = wval; 54 strcpy(bits,wbits); 55 return 0; 56} 57//buff:バイナリデータバッファ 58//pos:ビット位置 59//戻り値 指定位置のビット状態(0又は1) 60int getbit(unsigned char *buff,int pos) 61{ 62 int i; 63 int j; 64 i = pos / 8; 65 j = pos % 8; 66 if (((*(buff+i) << j) & 0x80) == 0) return 0; 67 return 1; 68} 69

実行結果
D:\goo\c\test_bit>fdump A.bin
000000: 0000 0000 0000 0002 3456 789a 0000 00 |........4Vx.... |

D:\goo\c\test_bit>goo1
normal end val = 288940 bit string=[1000110100010101100]

62は7byte目の6番目のビット
80は10bytes目の0番目のビット

投稿2022/04/13 02:42

編集2022/04/13 03:11
tatsu99

総合スコア5420

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

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

0

とりあえず、 120 バイトレコードの 62-80 の LSB を集めて数値化 (MSB が先 ) はこんな風でしょうか。

c

1#include <stdio.h> 2#include <stdlib.h> 3 4#define RECORD_SIZE 120 5#define START 62 6#define END 80 7 8int main(int argc, char *argv[]) { 9 if(argc != 2) { 10 fprintf(stderr, "Usage: %s <filename>", argv[0]); 11 return(1); 12 } 13 14 FILE *fp = fopen(argv[1], "rb"); 15 if(fp == 0) { 16 fprintf(stderr, "fopen error. filename='%s'\n", argv[1]); 17 return(1); 18 } 19 20 char buf[RECORD_SIZE]; 21 22 while(fread(buf, sizeof(buf), 1, fp)) { 23 int value = 0; 24 for(int i=START; i<=END; i++) { 25 value = (value << 1) | (buf[i] & 1); 26 } 27 printf("%d\n", value); 28 } 29 30 fclose(fp); 31 32 //fprintf(stderr, "end.\n"); 33}

投稿2022/04/12 14:45

jimbe

総合スコア12490

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

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

0

こんなのもアリか:

C++

1#include <iostream> 2#include <bitset> 3 4int main() { 5 6 std::bitset<32> input(0b01010001'10100100'01000110'10010110); 7 // inputを文字列に変換し、4文字目から8文字分を切り出してbitset<8>に変換 8 std::bitset<8> output(input.to_string().substr(4,8)); 9 // できたかな? 10 std::cout << output.to_ulong() << " : " << output.to_string() << std::endl; 11}

投稿2022/04/09 06:32

episteme

総合スコア16614

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

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

0

a番目からb番目までの並びの数字の列を10進数にしてint型の文字列に入れ

基本的な誤解があるようですが、intの中身は2進数の数値であり、10進数でも文字列でもないです。
intの値を10進数の文字列に変換するのは、printf系の関数です。

バイナリーデータを読むのであれば、

C

1#include <stdio.h> 2#include <sys/types.h> 3#include <arpa/inet.h> 4int main(){ 5 FILE *f; 6 u_int32_t data; 7 8 f = fopen("0","rb"); 9 fread(&data, sizeof data, 1, f); 10 data = ntohl(data); 11 ~~ 12}

で、dataの中にそのまま読めます。あとは「a番目からb番目」までに相当する部分をシフト演算で取り出します。
MSBが1番目、LSBが32番目だとすると、

C

1 data >>= 32-b; 2 data &= 0xffffffff >> a-1;

投稿2022/04/09 01:44

otn

総合スコア84283

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.53%

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

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

質問する

関連した質問