2

C ++で記述されたネイティブアプリがあります。

How to send message FROM native app TO Chrome extension?を使用して、ネイティブ アプリから Chrome 拡張機能にデータを送信できますか?

しかし、私は他の方法を理解することができません。

クロムドキュメント。states : Chrome は、個別のプロセスで各ネイティブ メッセージング ホストを起動し、標準入力 (stdin) と標準出力 (stdout) を使用して通信します。メッセージを両方向に送信するために同じ形式が使用されます。各メッセージは JSON を使用してシリアル化され、UTF-8 でエンコードされ、ネイティブ バイト オーダーで 32 ビット メッセージ長が前に付けられます。

chrome-extension によって送信された stdin からのデータをどのように読み取り/解釈するのですか?

4 バイトの長さの情報と、UTF-8 でエンコードされた残りのデータを読み取るにはどうすればよいですか?

助けてください!

ありがとう!

4

2 に答える 2

3

誰かがコメントで述べたように、長さが 255 より大きい場合、提供されたソリューションは機能しません。たとえば、実際の長さが 296 (バイナリ 00000001 00101000) の場合、前述のソリューションは 41 => 00000001 + 00101000 = 1 + 40 = 41 を生成します。

読み取られるバイト数を考慮する必要があります。この例では、長さを計算する正しい方法は 1*(2^8) + 40 = 296 です。したがって、正しい解は次のようになります。

unsigned int length = 0;

//read the first four bytes
for (int i = 0; i < 4; i++) {
  int read_char = getchar();
  length += read_char * (int) pow(2.0, i * 8);
}

ビットのシフトとビット操作に基づくより良い解決策を以下に示します (おそらく、理解するのは少し難しいかもしれませんが、確実にきれいになります):

unsigned int length = 0;

for (int i = 0; i < 4; i++) {
  unsigned int read_char = getchar();
  length = length | (read_char << i * 8);
}

getchar() は、現在の長さの値でビット OR を実行する前に、unsigned int にキャストされた int を返すことに注意することが重要です (int には符号用に予約されたビットが 1 つありますが、unsigned int には予約されていません)。

異なるアーキテクチャでこのソリューションをテストしていないため、ここで発生する可能性がある潜在的なビッグ/リトル エンディアンの問題についてはわかりません。経験豊富な方にコメントいただけると幸いです。

于 2014-10-01T11:40:52.350 に答える