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

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

ただいまの
回答率

87.79%

構造体に16進数のリストを格納したい

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 986

score 26

Windowsフォームズアプリケーションでアプリを作っています。環境はVC++です。
16進数のリストが書いてあるファイルを読み込み、構造体にデータを格納したいのですが、方法が思い浮かばず困っています。

以下のような構造体があるとして、

typedef struct {
    char aaa[56];
    char bbb[56];
    char ccc[56];
} example;

以下のようなファイルを読み込み、構造体exampleにデータを格納したいです。

0x00,0x01,0x02,0x03,0x04,0x05
0x01,0x01,0x02,0x03,0x04,0x05
0x02,0x01,0x02,0x03,0x04,0x05
0x03,0x01,0x02,0x03,0x04,0x05

このとき、aaaやbbbに一つずつ格納するのではなく、ファイルの先頭から、aaaに限界まで16進数を格納し、aaaがいっぱいになったら次はbbbに16進数を格納する、という方法でデータを格納したいです。

例で表すと、太字部分をaaaに格納した後、
斜体部分をbbbに格納していきたいです。

0x00,0x01,0x02,0x03,0x04,0x05
0x01,0x01,0x02,0x03,0x04,0x05
0x02,0x01,0x02,0x03,0x04,0x05
0x03,0x01,0x02,0x03,0x04,0x05

つたない質問で申し訳ありませんが、どうぞよろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kazuma-s

    2020/01/21 23:23

    「aaaに限界まで16進数を格納し、aaaがいっぱいになったら
    次はbbbに16進数を格納する」となっています。
    aaa も bbb も 56バイトです。
    例では、太字部分の 7個の 16進数をを aaaに格納した後、
    斜体部分の 7個の 16進数ををbbbに格納しています。
    一つの 16進数を格納するのに 8バイト必要だということでしょうか?
    もっと詳しい説明を追加してください。

    キャンセル

  • Grayi

    2020/01/22 22:02

    ご指摘ありがとうございます。
    16進数は4byteでした。数を数え間違ってしまっていました。
    質問を修正します。

    キャンセル

  • kazuma-s

    2020/01/23 03:04

    「16進数は4byte」とはどういうことでしょうか?
    4バイトの整数を 16進数で表すと、0x00000000~0xffffffff です。
    例では 0x00~0x05 だけしかなく 1バイトに収まりますが、
    例えば、2番目の 0x01 を aaa[4]~aaa[7] に入れるとき、
    00 00 00 01 と入れるんですか? それとも
    01 00 00 00 と入れるんですか?
    すでに解決済みだというのなら、そのコードを質問に追記してください。

    キャンセル

回答 4

checkベストアンサー

+1

構造体のメンバを気にせず、単純に先頭から埋めていけばいいのでは?
ざっくりなイメージですけど、こんな感じ。

char *p;
char hex;
for(p = (char*)&example; p < example + sizeof(example); p++){
    hex変数に読み込み
    EOFならbreak
    *p = hex
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/22 22:00

    回答ありがとうございます。ttyp03さんに教えていただいた方法で解決することが出来ました!
    ポインターを使って、先頭から埋めていくことが出来ました。
    大変勉強になりました。ありがとうございます。とても助かりました。

    キャンセル

+1

16進数のリストを格納しないで、

ファイルの数値をバイトデータに変換して格納していけばよろしい。
16進数のリストが必要なら、そのバイトデータを変換していく、と。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/22 21:46

    回答ありがとうございます。
    ファイルの数値をバイトデータに変換後、構造体にデータを格納していこうとしたのですが、メンバに格納することはできても、「メンバ変数に限界までデータを格納してから次のメンバ変数に格納する」ことが私の力不足でできませんでした。
    他の方の回答方法で問題を解決することができましたが、y_waiwaiさんが教えてくださった方法でもできるように勉強します。
    本当に回答ありがとうございます。勉強になります。

    キャンセル

+1

こんにちは。

C++の変数に「16進数」を記録する機能はありません。数値か文字だけです。
一般に16進数は文字(0~9, A~F)で表現されますので文字列として保存することは可能です。

Grayiさんの思いは、カンマで区切られた16進数文字列を数値へ変換してaaa[i]へ保存するのでしょうか?
その場合は、0xを読み飛ばして次の2文字を16進数として数値へ変換してaaa[i]へ保管後 ,や改行を読み飛ばす処理を繰り返すイメージとなります。
16進数文字列を数値へ変換するには、std::stoi()が便利です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/22 21:51

    こんにちは。回答ありがとうございます。

    Chironianさんが教えてくださった方法でコードを書き、16進数文字列を数値に変換しaaa[i]へ保存するところまでは出来ました。しかし、私の力不足で、一つのメンバ変数につき一つの数値を格納することはできたのですが、「メンバ変数に限界までデータを格納してから次のメンバ変数に格納する」ことができませんでした。
    今回は他の方の回答方法で問題を解決することができたので、ベストアンサーはその方にすることにしましたが、Chironianさんのおかげでとても勉強になりました。
    丁寧に教えてくださってありがとうございます。とても助かりました。

    キャンセル

+1

一緒にコンパイルする・・・てのはダメですか?

char table[] = {
#include "ファイル名"
};


で、先頭から構造体に格納。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/22 21:56

    こんな方法があるなんて知りませんでした!
    残念ながら、今回は作成しているアプリの都合上、ファイルをexeに読み込ませる形になるため、ベストアンサーは他の方を選ばせていただきました。ファイルをexeに読み込ませる、ということをちゃんと質問に書いていなくて申し訳ありません。
    大変勉強になります。とても便利そうな方法なので、cateyeさんに教えていただいた方法でも何かコードを書いてみようと思います。本当に回答ありがとうございます。

    キャンセル

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

  • ただいまの回答率 87.79%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る