• 締切済み

1バイトデータの読み出しについて

こんばんは。 すみません。文字操作?ポインタ操作が苦手なので教えてください。 以下のような構造体があり、その構造体から1バイトずつ読み出して 自作の関数のパラメータ(1バイト指定領域)に渡したいのですが、 構造体から1バイトずつデータを読み出すには、どのようにすればいいのでしょうか? typedef struct { PACKET_HEADER head; unsigned char Sp_Pr_St[1]; unsigned char ctrl_flow[1]; unsigned char product_org[10]; unsigned char product_name[10]; unsigned char product_ver[3]; }PRODUCT_RESPONS; typedef struct { unsigned char head; unsigned char type; unsigned char data_len; } HEADER; どうぞよろしくお願いします。

みんなの回答

回答No.4

char系 しか利用していない構造体はかならず、先頭から宣言した順序でメモリ配置されます。 また、アライメントの調整もされないです。(言語仕様の特例) なので、この構造体ならば #1 に一票。 int とか long を含んだ場合、とたんに破綻するのでご注意。 # まぁPACKETというあたりそんな変数は出てこないと思いますが。。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

ファイルフォーマットかなんかでしょうか? それでしたら、構造体は不向きです。 パディングやエンディアンの問題があります。 ファイルポインタ等から、任意のバイトを取得する関数を作って地道に処理をするほうが結局のところ近道ですよ。

回答No.2

例にあるような、別々の名前をつけて定義された変数の、メモリ上での並びの連続性は、特別な場合(文字列の定義など)以外、構造体の中ででも保証されません。パディングと言って、CPUのメモリアクセス効率・制限などの理由により、間に空白(未使用領域)が挿入されることがあります。ですから共用体にしても変わりありません。 「名前」でそれぞれのアクセスにするべきです。

回答No.1

union を使えばいいのではないでしょうか? union byte_array { unsigned char bytes[28]; PRODUCT_RESPONS; }; PRODUCT_RESPONS pr; union byte_array bu; bu.PRODUCT_RESPONS = pr; bu.bytes[0]; bu.bytes[1]; bu.bytes[2]; あるいは、単純にポインタにキャストするとかでしょうか? PRODUCT_RESPONS pr; unsigned char *bp; bp = (unsigned char *)≺ bp[0]; bp[1]; bp[2]; まあ、うまくできるかどうか分かりませんが、参考にしていただければ幸いです。

関連するQ&A

  • 異なる構造体のデータのコピー

    (1)で受け取った構造体のメンバのデータを (2)の構造体のメンバにコピーしたいと考えています。 (1) typedef struct _recvData{ int data01; int data02; char data03; char data 04; char data05; char data 06; char data07; char data08; char data09; char data10; char array01[16]; char array02[16]; } recvData; (2) typedef struct _sendData{ int header; int data01; int data02; char data03; char data 04; char data05; char data 06; char data07; char data08; char data09; char data10; int array01[4]; int array02[4]; } sendData; そこで2点ほどおしえていただきたく、お願い致します。 (1)構造体が微妙に異なるため、各メンバ変数に値をそれぞれ代入していくしか方法がないのでしょうか? (2)array01, array02はデータの型が異なる場合、データのコピーはどのようにしたらよいでしょうか?

  • リトルエンディアン→ビッグエンディアン

    (1)リトルエンディアン typedef struct recvData{  int a;  unsigned char b[16]; unsigned char c[8]; unsigned int d[4]; } recvData_t; recvData_t rData; (2)ビッグエンディアン typedef struct sendData{  int a;  unsigned int b[4]; unsigned int c[2]; unsigned int d[4]; } sendData_t; sendData_t sData; 上記のようなリトルエンディアンの構造体の各メンバのデータを、ビッグエンディアンの構造体の各メンバのデータにそれぞれ格納するには どうしたらよいでしょうか?

  • 構造体の宣言について

    今解析しているC言語のプログラムで以下の様な構造体の宣言があります。 typedef struct { unsigned char :3; unsigned char aaa :1; unsigned char bbb :1; unsigned char ccc :1; unsigned char ddd :1; unsigned char eee :1; } tTSR ; :3や:1の部分の意味がわかりません。 御存知の方ご回答よろしくお願いします。

  • パケット通信

    C言語初心者です。 H8が乗っているコントローラとシリアル(RS232C)で繋がっている機器間で、 パケットを構成し通信したいのですが、そのパケットの快適な構成方法がわかりません。(コントローラ側のプログラムを作っています) イメージとしては構造体を使用すると快適なのかな?と思うのですが、 よくわかりません。 機器側のパケットは仕様があり、 スタートコード(2)-データ長(1)-データ長チェックサム(1)-データ(n)-データチェックサム(1) のような構成になっています。 ( )はバイト数です。 バイナリデータでの通信です。 データの先頭にコマンドコードがあり、機器の制御をするような感じです。 例えばですが、 typedef struct { unsigned char start[2];----->スタートコード(固定) unsigned char len;---------->データ長(変動) unsigned char len_cs;------->データ長チェックサム(計算) unsigned char data[SIZE];--->データの中身(変動) unsigned char data_cs;------>データチェックサム(計算) } packet; というようなやり方で、固定データや変動するデータを構造体として 使用することはできるのでしょうか? unsigned char cmd[] = {0x00,0x00,・・・・0x00} のように強引にスタートコードからデータ、チェックサムを 配列で並べて送信すると機器はちゃんと動作します。 (チェックサムの計算も電卓で計算してから書いてます) ただ、コマンドごとにこんなパケットを構成しないといけない のは手間ですし、何かブサイクに思えます。 快適なパケット作成の方法があればぜひ教えて下さい。 よろしくお願いします。

  • データの比較の仕方について

    --宣言-- typedef struct { int len;/* ptrの長さ */ unsigned char *ptr; } aaa; char abc[128]; --宣言end---- HIKAKU(aaa *d1,char *d2) { d1,d2にはそれぞれデータが入力されてくる。 d2はabcのポインタ。 } d1,d2の実体を比較し一致するか否か判定したいのですが、 何分初心者なもので・・・ アドバイス頂けないでしょうか? 宜しくお願い致します。

  • ファイルポインタfpを、何バイト読んだかカウンタとして使うには?

    ファイルポインタfpを、何バイト読んだかカウンタとして使うには?どうしたら良いか教えてください。binary fileをオープンして、1Byteずつc=fgetc(fp); を繰り返し読込み特定の処理します。数百万バイトを読んだあたりで、こけるので、何バイト目あたりでこけているのか知りたいというのが動機です。 fp構造体の中で、今、ファイルの冒頭から何バイト読んだところ、という情報を引っ張り出して1Byte読み込むごとに(ずらずらとでいいので)表示したいです。fp->current_byte とかいう情報があるように想像するのですが、どうでしょうか。以下に、#include<stdio.h>の中で、FILE を引用します。 typedef struct { unsigned char *curp; /* Current active pointer */ unsigned char *buffer; /* Data transfer buffer */ int level; /* fill/empty level of buffer */ int bsize; /* Buffer size */ unsigned short istemp; /* Temporary file indicator */ unsigned short flags; /* File status flags */ wchar_t hold; /* Ungetc char if no buffer */ char fd; /* File descriptor */ unsigned char token; /* Used for validity checking */ } FILE; /* This is the FILE object */

  • ファイル操作について

    ファイルから情報を読みこみ構造体に設定しようとしています。 方法としては、fopen,fgetsにより行取得しようと考えているのですが、ファイルが以下のようになっており、 キーワードに対応する構造体も決まっています。 力作業で設定しても良いのですが、何かもっと美しい方法があれば助言お願いします。 ファイル内容 (A) AAA="12345" BBB="33333" (B) BBB="1122" CCDD="5674" (C) TTTT="#####" AAAA="kkkkk" 設定する構造体 typedef struct{ char AAAA[20]; char BBBB[20]; }A; typedef struct{ char BBB[20]; char CCDD[20]; }B; typedef struct{ char TTTT[20]; char AAAA[20]; }C; です。

  • 構造体のファイル出力

    以下のような構造体を、テキストファイルに保存するにはどうしたらよいでしょうか? 構造体には、4つのデータがある場合、以下のようにします。 [構造体] typedef struct comp_bango { char bango[3]; } COMP; 出力テキスト 100 200 300 400

  • 構造体のアライメント調整

    構造体のアライメント調整について教えて下さい。 (1) アライメント調整を行う目的は何ですか? (2) char = 1byte short = 2byte int = 4byteの時、 下の構造体にアライメント調整を行うとすれば、どうすればいいでしょうか? typedef struct{ ____char hoge1 ____char hoge2 ____short hoge3 ____char hoge4 ____int hoge5 ____int hoge6 ____char hoge7 }tHOGEHOGE 下の形になるかなぁと思っているのですが、本当に(1)~(4)まで全部必要でしょうか? typedef struct{ ____char hoge1 ____char hoge2 (1)__char reserve[2] ____short hoge3 (2)__char reserve[2] ____char hoge4 (3)__char reserve[3] ____int hoge5 ____int hoge6 ____char hoge7 (4)__char reserve[3] }tHOGEHOGE つまらない質問で申し訳ありませんが、 よろしくお願いいたします。

  • アドレス指定方法

    お世話になります アドレス指定について教えてください 例えば、構造体の配列があります typedef struct {   unsigned char m_bDat;   unsigned char m_bTemp; }tTEST; tTEST tTest[ 10 ]; // tTESTの配列を作成 この、"tTest[ 10 ]"の先頭アドレスを指す際の方法について 1.tTest 2.&tTest[ 0 ] 3.&tTest コンパイルしてみると、どれも同じ結果となったので、間違っていないと思うのですが・・・ 1~3項について、詳しく御教授して下さい よろしくお願い致します

専門家に質問してみよう