このバイナリファイルには装置が測定測定するごとに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番目のビット