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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

2回答

235閲覧

Swiftの構造体のデータをバイナリファイルに書き出したいため、構造体を[UInt8]またはData/NSDataに変換する方法

MaruSanei

総合スコア1

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2024/03/22 08:03

編集2024/03/22 08:22

実現したいこと

(1) 外部からデータを受け取り構造体に格納する。← ここは実現できています。
(2) 構造体のデータを[UInt8]またはData/NSDataに変換する。← 実現できていない(わからない)部分。
(3) (2)で変換したデータをバイナリファイルとして書き出す。← 実現方法はググって出てきました。

前提

開発環境:Xcode15.2
開発言語:Swift 5 ("Build Settings" - "Swift Language Version" で確認)

上記「実現したいこと」の(2)に関して、
後述の「該当のソースコード」のように外部から型の異なるデータを取り込み、
構造体「allCommands」に格納する仕組みとなっております。
この構造体のデータをバイナリファイルとして書き出すことが目的ですが、
その前に[UInt8]またはData/NSDataに変換しなければなりません。

該当のソースコード

Swift

1// 構造体 2class StructData { 3 public struct allCommands { 4 var stCommand1 = command1() 5 var arr_stCommands2 = [commans2()] // 同じデータ構造を複数取り込むための構造体command2の配列。 6 } 7 8 public struct commands1 { 9 var header: [Int8](repeating: 0x00, count:16) // ← 初期値。実際は別の値。 10 var numberOfCommands: Int32 = 0x00000000 // ← 初期値。実際は別の値。 11 } 12 13 public struct commands2 { 14 var commandType: Int32 = 0x00000000 // ← 初期値。実際は別の値。 15 var numbrOfParams: Int32 = 0 // ← 初期値。実際は別の値。 16 var parameters: [Int32](6) 17 var binStrings: [Int8](16) 18 var count: Int32 = 0 // ← 初期値。実際は別の値。 19 } 20}

試したこと

構造体のデータをバイナリファイルとして書き出すために、下記のようにコードしましたが、
この先どのように変換したら良いのか全くわかりません。

Swift

1stAllCommandsToFile: [StructData.allCommands] = [StructData.allCommands]( arr_stCommands2:[StructData.commands2()])] 2// (1) 外部からデータを受け取り構造体に格納する。← ここは実現できています。 3 4// (2) 構造体のデータを[UInt8]またはData/NSDataに変換する。← 実現できていない部分。 5var binDataToFile = [UInt8]() // バイナリファイルとして書き出すための配列 6??? ??? 7 8// (3) (2)で変換したデータをバイナリファイルとして書き出す。← 実現方法はググって出てきました。 9

恐れ入りますが、どなたか良い方法がありましたら、ご教授頂けますと助かります。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

バイナリの構造が不明なので[Int32]などを[UInt8]に変換する方法だけ。
ArrayのwithUnsafeBytes(_:)を使います。
↓リファレンスのサンプルコードが希望するコードの断片になっています。
https://developer.apple.com/documentation/swift/array/withunsafebytes(_:)

バイナリの構造に合わせてリファレンスのサンプルコードでいうbyteBufferに追記していけばお望みの[UInt8]が作成できます。

投稿2024/03/25 01:13

MasakiHori

総合スコア3384

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

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

MaruSanei

2024/03/26 07:43

KEMONO_PANTSU_kさん、MasakiHoriさん どうもありがとうございます。 お二人の提案をミックスすると実現できそうなそうな目算がたちました。 構造体「commands1」と「commands2」には複数のデータ型があり、かつ、これらが構造体「allCommands」のメンバーで、片方は構造体の配列ですので、ご提案のうちの片方だけでは実現できないようでした。 (なんでこんな面倒くさい構造体にしているのか? ... 電文データを作っているヤツが憎い!) もう少し当方でプログラムの検証を進め、実現できましたら、お知らせしたいと思います。
MaruSanei

2024/03/28 01:51 編集

KEMONO_PANTSU_kさん、MasakiHoriさん どうもありがとうございます。 おかげさまで後述の方法により解決致しました。 ※ お二方のご回答が「ベストアンサー」ですが、どちらか片方しか付けられないようですので、  平等を期してどちらにも付けられませんでした。 ごめんなさい。 構造としては、下図のようになります。 構造体の要素が配列の時と数値の時で、KEMONO_PANTSU_kさんのご助言と MasakiHoriのご助言を使い分け、構造体の各要素に適用します。 スマートな方法では無いと思いますし、力技ですが、これで実現できました。 '''Swift // 配列の時: allCommands.stCommands1.header[n].withUnsafeBytes { binDataToFile.append(contentsOf: $0) } // 数値の時: withUnsafeBytes(of: allCommands.stCommands1.numberOfCommands.bigEndian) { binDataToFile.append(contentsOf: $0) } ''' ----- 図: 実際の構造体の構成 ----- allCommands  + commands1   + header    + [0]    + ...    + [n]   + numberOfCommands  + commands2[0]   + commandType   + numbrOfParams   + parameters    + [0]    + ...    + [n]   + binStrings    + [0]    + ...    + [n]   + count  + commands2[1]   + ...  + commands2[n]   + ...
MaruSanei

2024/03/28 01:52

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。
guest

0

この構造体のデータをバイナリファイルとして書き出すことが目的ですが、

書き出したものを別のシステムで使うのかどうかなどで回答が変わってきてしまいそうですが、次のようなQAがありました。
参考になりますでしょうか。

serialization - Swift structs to NSData and back - Stack Overflow

投稿2024/03/22 10:48

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

MaruSanei

2024/03/22 15:05

早速ご回答頂きまして、ありがとうございます。 書き出したものを別のシステムで使うのか?という点につきましては、現在のところファイルに書き出したバイナリデータはiOS/iPadOSの中で完結しますので、特に問題視しておりません。 ご提案頂いた Stack Overflow のやり方につきましては、3/26(火)にオフィスに出社した時に試してみたいと思います。 まずは、お礼を申し上げたくコメント致しました。
MaruSanei

2024/03/25 11:22

KEMONO_PANTSU_kさん、MasakiHoriさん どうもありがとうございます。 明日3/26に自社のオフィスに出社しますので、試してみたいと思います。
MaruSanei

2024/03/26 07:45

KEMONO_PANTSU_kさん 本日、MasakiHoriさんのご回答にコメントした内容をご参照ください。
MaruSanei

2024/03/28 01:53

本日、MasakiHoriさんのご回答にコメントした内容をご参照ください。 回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。
退会済みユーザー

退会済みユーザー

2024/03/28 10:44

何度もご丁寧なコメントありがとうございます。 解決したようで良かったです。 MasakiHoriさんのご回答の方で解決済みにすることで良いのではないかと思います。 *解決済みになっていないと、後から見た時に解決していないのかな?と見えてしまうかもしれませんのでね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問