2016-06-19 2 views
1

NSURLConnectionを使用して私のアプリでUIImageにビデオをストリーミングしています。Objective CからSwiftに変換した後、ビットシフトUInt8を発行します

  1. 私はpayloadsizeがuint8に変換するための最良の方法のわからない:私はここに二つの問題が生じています

    func connection(connection: NSURLConnection, didReceiveData data: NSData) { 
    
        //...other code 
    
        UInt32 sizeOfJPEG_1; //same type as was in Objective C 
    
        var payloadsize = [UInt8](count: 4, repeatedValue: 0x00) //was uint8_t in Objective C 
        data.getBytes(&payloadsize[1], range: NSMakeRange(12, 3)) 
        payloadsize[0] = 0 
        sizeOfJPEG_1 = (payloadsize[1] << 16) + (payloadsize[2] << 8) + payloadsize[3]//here is the problem 
        //UInt32(sizeOfJPEG_1 = (payloadsize[1] << 16) + (payloadsize[2] << 8) + payloadsize[3]) //the way I am currently dealing with converting my shifting and additions to the correct sizeOfJPEG_1 UInt32 argument type 
        //..more code 
    } 
    

    :客観CIで働く私のコードの一部は、トラブルスウィフトへの変換を持っていますそれだったら客観Cタイプはuint8_tだった、私はUINT8 < < 16をシフトしますランタイムエラーですUInt32型 さらに重要なenter image description here

  2. は、おそらく、最初に把握するために、引数にbitshiftingや追加、私は知りません法的な操作N uint8_tのtyupe対物CにおいてとちょうどIがUINT8 < < 16ならびにUINT8 < < 8を左シフトしていたので、私は、オーバーフローエラーを取得していUINT8

の種類とスイフトではありません。 致命的なエラー:シフト量IがI対物Cが静かuint8_t < < 16 withoをシフトさ理解すると思うビット

enter image description here

タイプのサイズよりも大きいですuint8_t < < 16の結果はどのように計算するのか分からないが、それは0ではないだろうか? (uint8_tは、unsigned char型として定義される)

+0

これは基本的なスウィフト機能です。スウィフトの本をダウンロードして読んでください。あなたの変数が0でない限り、16ビット位置のシフトはオーバーフローします。 – gnasher729

+1

@ gnasher729:そうではありません。 Swiftの書籍には次の​​ように書かれています。「整数の記憶域の境界を越えて移動するビットは破棄されます」唯一の制限は、シフト量が対応するデータ型のビット数よりも小さくなければならないことです。 –

答えて

3

明示的に(データをシフト 前に)それをしなければならないので(Objective-)Cとは異なり、スウィフトは、intまたはunsigned intに小さい整数タイプ を促進しません:

let sizeOfJPEG_1 = UInt32(payloadsize[1]) << 16 + UInt32(payloadsize[2]) << 8 + UInt32(payloadsize[3]) 
関連する問題