2016-05-24 11 views
1

クロムのネイティブメッセージング拡張機能を書いています。プロトコルごとに最初の4バイトをデータの長さとして出力する必要があります。スウィフトで 0を標準出力に出力する方法

私はObjective Cの中でこれを行う場合、それは動作します:次のように私はスウィフトにそれを作ることができます

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
     char data[] = "{\"payload\":\"19\"}"; 
     int len = strlen(data); 

     printf("%c%c%c%c", 
       (char)((len>>0) & 0xff), 
       (char)((len>>8) & 0xff), 
       (char)((len>>16) & 0xff), 
       (char)((len>>24) & 0xff)); 
     printf("%s", data); 
    } 
    return 0; 
} 

最高の翻訳は次のとおりです。

import Foundation 

var data:String 

data = "{\"payload\": \"100\"}" 

var length:Int 
length = data.characters.count 

print(String(format: "%c", (UInt8)((length >> 0) & 0xff)), terminator:"") 
print(String(format: "%c", (UInt8)((length >> 8) & 0xff)), terminator:"") 
print(String(format: "%c", (UInt8)((length >> 16) & 0xff)), terminator:"") 
print(String(format: "%c", (UInt8)((length >> 24) & 0xff)), terminator:"") 
print(data, terminator:"") 
fflush(__stdoutp) 

これはクロームでエラーを示しますログ:

[458:33283:0524/103231:ERROR:native_message_process_host.cc(292)] 
Native Messaging host tried sending a message that is 1881307922 bytes long. 

何が起こっているのは、最初のバイトが印刷されていますが、残りの3バイトには値はゼロであるため、明らかに文字列の最後であるNUL文字に変換されるため、何も印刷されません。データの最初の3文字({"p)を変更すると、その番号1881307922も変更され、最初の4バイトがメッセージの長さを決定するために読み取られ、3つのNULバイトが印刷されないことが確認されます。

私が今やっていることからほとんど逸脱しない解決策が欲しいです。私が示していないアプリケーションには他にもたくさんのものがあります。あなたが非常に異なるソリューションを提案すれば、他の多くのコードを書き直さなければならないということです。

答えて

0

このように、Character(UnicodeScalar(String(format:一部を置き換えます。

import Foundation 

var data:String 

data = "{\"payload\": \"100\"}" 

var length:Int 
length = data.characters.count 

print(Character(UnicodeScalar((UInt8)((length >> 0) & 0xff))), terminator:"") 
print(Character(UnicodeScalar((UInt8)((length >> 8) & 0xff))), terminator:"") 
print(Character(UnicodeScalar((UInt8)((length >> 16) & 0xff))), terminator:"") 
print(Character(UnicodeScalar((UInt8)((length >> 24) & 0xff))), terminator:"") 
print(data, terminator:"") 
fflush(__stdoutp) 
関連する問題