🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

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

Q&A

解決済

5回答

1773閲覧

QString等のクラス型変数を含んだ構造体をバイト配列にするには

tuyudaku

総合スコア75

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

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

0グッド

0クリップ

投稿2019/11/06 10:59

ダメもとの質問になってしまうのですが...

構造体のメンバにQString等のクラス型変数を含んでいる
つまり、単純なmemcpyでは値のコピーが出来ないようなクラスを含んでいる場合
バイト配列に変換する関数などを作って
地道にバイト配列へ変換していくしか方法は無いでしょうか...?

構造体の値をFRAMに格納するために、バイト配列にする必要があるのですが
格納する構造体が結構な量のメンバなため、コレを変換するのか...
という状態です。

そもそも設計の時点で問題があるのですが
何とか簡単に変換できる方法はありませんでしょうか...

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

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

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

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

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

guest

回答5

0

こんにちは。

地道にバイト配列へ変換していくしか方法は無いでしょうか...?

基本的にはその通りです。構造体のメンバを1つ1つ指定してシリアライズとデシリアライズを行います。
その際に1つ1つのメンバ変数のシリアライズとデシリアライズをライブラリに任せることでかなり楽になります。boost::serialization が参考になると思います。

私もその手のシリアライザを開発しています。1つ1つ指定しないで良いことがメリットの1つなのですが、最近メンテナンスできていません。

投稿2019/11/06 12:23

Chironian

総合スコア23272

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

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

tuyudaku

2019/11/07 01:24

>構造体のメンバを1つ1つ指定してシリアライズとデシリアライズを行います やはりそうですよね... >boost::serialization が参考になると思います。 そんなのがあるのですね! お勉強させていただきます 回答ありがとうございました
guest

0

こういう構造体やクラスの値をシーケンシャルな形で展開する、ってのをシリアライズといったりします
ということで、
「C++ シリアライズ」とか、シリアライザ、とかでぐぐるといろいろ出てくると思います

#ましかし、FRAMに格納する用途で使えるかどうかってのは別の話になりますが

投稿2019/11/06 11:23

y_waiwai

総合スコア88040

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

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

tuyudaku

2019/11/07 00:35

ありがとうございます 調べてみます
guest

0

QStringとやらがQtの奴ならば
( Qt C++ )QDataStreamにおいて独自型を使用する。
が参考になるかと思います。

投稿2019/11/07 01:09

asm

総合スコア15149

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

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

tuyudaku

2019/11/07 01:28

>( Qt C++ )QDataStreamにおいて独自型を使用する。 参考サイトありがとうございます! QDataStreamを使うのが良さそうですね! 回答ありがとうございました
guest

0

ベストアンサー

既に他の方が記載されているように「シリアライゼーション」がキーワードになりますね。

Qt の場合は、QDataStream を使うのが一番簡単で色々なクラスに対応しやすい方法です。

次の候補は JSON、CBOR で、 Qt が提供する QJson*、QCbor* 系のクラスを使うことでシリアライゼーションが可能です。

ProtocolBuffers は Qt 自体ではインターフェースを提供していませんが少し工夫をすることで簡単に使うことができます。

https://blog.qt.io/jp/2018/10/28/serialization-in-and-with-qt/
などを参考に今回のユースケースに一番合う選択をしてみてはいかがでしょうか。

投稿2019/11/07 00:52

tasuku.

総合スコア347

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

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

tuyudaku

2019/11/07 01:27

>Qt の場合は、QDataStream を使うのが一番簡単で色々なクラスに対応しやすい方法です。 皆さんからの「シリアライズ」というキーワードから QDataStreamを使うのが無難かなと思いました! >https://blog.qt.io/jp/2018/10/28/serialization-in-and-with-qt/ FRAMのサイズはそこまで大きくないのでJSONを書くのは難しいかもしれませんが FRAM用以外のデータはJSONで持っておくのがよかったのでは.... と思いましたw 今更どうしようも出来ないので、今後の開発での選択肢として お勉強したいと思います! 回答ありがとうございました
guest

0

そもそもなんでそんな必要性に遭遇しているのでしょうか?
jsonにするとかprotocol buffer使うとか既存のものは色々ありますが、それらでは要求を満たさないのでしょうか

投稿2019/11/06 11:45

yumetodo

総合スコア5852

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

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

tuyudaku

2019/11/07 00:40

ばっさり言い捨ててしまうと 設計ミス(そもそも設計が無い)のと 有識者がいないためそもそもそこに至らない、 また、既存インターフェースにあわせるためなどです protoclo buffersというのは初めて知りましたが jsonに関しては、私自身もそういうものがある程度の知識しかなく それをどう活用すれば良いのかまでは分かりません 調べろよ、となってしまいますが そもそも私が関わり始めたのがコーディングからなのでもはや手遅れでした (そして設計書が無いことに気付いたときには絶望です) 回答ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問