21594


NSDataからArray配列に変換したのですが、  
このデータをC言語で作ったような構造体にキャストして、  
構造体のそれぞれのメンバーの値を取得したいのですが、  
swiftでどのようにすべきなのかが浮かびません。。  
そもそもCの構造体を使用するよりもArray配列の何バイトめから何バイトまでを取得するのが良いのでしょうか。（testはaBuffer[0]～[1]の値のような）

[code]

    var aBuffer = Array<Int8>(count: aData.length, repeatedValue: 0)
    aData.getBytes(&aBuffer, length: aData.length) 
    
    ===構造体
    struct record
    {
        int test;
        int test_int[2];
        char test_char[8];
        long test_long[10];
    };
    
[/code]


CC BY-SA 3.0
2016-02-01T14:35:44.507
21585
2016-02-02T00:46:17.993
12842
question
swift
Array配列を構造体にキャストしたい


型（データサイズ）の異なるメンバーで構成した構造体ですから、地道にひとつずつ値を代入するのがいいのではないかと思います。  
以下のサンプルコードは、サイズの異なる4つの整数値をメンバーとしました。64ビット環境では、（C言語の）int、long、long
longは同じ8バイト（64ビット）のサイズになるので、よりわかりやすい例にしました。

[code]

    import Foundation // Playgroundで実行できるコードにしています。
    
    // まず、元データを作成。
    var test8: Int8 = 32
    var test16: [Int16] = [64, 65]
    var test32: [Int32] = [128, 129, 130]
    var test64: [Int64] = [256, 257, 258, 259]
    
    // NSDataに変換。
    let data8: NSData = NSData(bytes: &test8, length: sizeof(Int8))
    let data16: NSData = NSData(bytes: &test16, length: sizeof(Int16) * 2)
    let data32: NSData = NSData(bytes: &test32, length: sizeof(Int32) * 3)
    let data64: NSData = NSData(bytes: &test64, length: sizeof(Int64) * 4)
    
    // 全データを結合。
    let data: NSMutableData = NSMutableData()
    data.appendData(data8)
    data.appendData(data16)
    data.appendData(data32)
    data.appendData(data64)
    
    // 格納先構造体の定義。
    struct Numbers {
        var first8: Int8 = 0
        var second16: [Int16] = [0, 0]
        var third32: [Int32] = [0, 0, 0]
        var fourth64: [Int64] = [0, 0, 0, 0]
    }
    
    // 構造体の生成。
    var theNumber = Numbers()
    
    // NSMakeRange()で、切り出すデータの先頭と長さを指定し、切り出す。
    var firstBytes = [Int8](count: 1, repeatedValue: 0)
    data.getBytes(&firstBytes, range: NSMakeRange(0, sizeof(Int8)))
    theNumber.first8 = firstBytes[0]
    // 以下同様。
    var secondBytes = [Int16](count: 2, repeatedValue: 0)
    data.getBytes(&secondBytes, range: NSMakeRange(sizeof(Int8), sizeof(Int16) * 2))
    theNumber.second16 = secondBytes
    
    var thirdBytes = [Int32](count: 3, repeatedValue: 0)
    data.getBytes(&thirdBytes, range: NSMakeRange(sizeof(Int8) + sizeof(Int16) * 2, sizeof(Int32) * 3))
    theNumber.third32 = thirdBytes
    
    var fourthBytes = [Int64](count: 4, repeatedValue: 0)
    data.getBytes(&fourthBytes, range: NSMakeRange(sizeof(Int8) + sizeof(Int16) * 2 + sizeof(Int32) * 3, sizeof(Int64) * 4))
    theNumber.fourth64 = fourthBytes
    
    // 結果の出力
    print(theNumber)
    
[/code]

> 出力：Numbers(first8: 32, second16: [64, 65], third32: [128, 129, 130],
> fourth64: [256, 257, 258, 259])

SwiftとObjective-Cをブリッジして、Objective-
C側で処理をC言語で記述し、関数化してSwift側で使うというアイデアもあると思います。


CC BY-SA 3.0
2016-02-02T00:46:17.993
21594
2016-02-02T00:46:17.993
7362
21585
answer