2016-11-28 11 views
0

protoc --decodeで使用されるバイナリ - テキストエンコーディングは何ですか?私はprotocの--decodeコマンドの出力で探していますし、それはバイトに遭遇したとき、私は使用するエンコーディングを測深することはできません

data { 
    image: "\377\330\377\340\000\020JFIF\000\001[…]\242\2634G\377\331" 
} 

[...]出力を短縮するために私が追加されました。

これはどのようなエンコードですか?

編集

だから、ブルースの回答に基づいて、私はシェルスクリプトからのサンプルデータを生成するために、私自身のユーティリティを書いた:私は、シリアル化を呼び出すことができる方法

public static void main(String[] parameters) throws IOException { 
    File binaryInput = new File(parameters[0]); 
    System.out.println("\""+TextFormat.escapeBytes(ByteString.readFrom(new FileInputStream(binaryInput)))+"\""); 
} 

}

私のバイナリファイルをprotobufのテキストシリアライゼーションに挿入してからprotock -encodeを呼び出してください:

template.protobufされた状態で

uuid: "{UUID}" 
image { 
    capture: "{IMAGE}" 
} 
+0

このボーナスの質問は:このフォーマットの**目的**は何ですか? バイナリを表示するための事実上の標準は、16進値を表示することです。誰かがなぜ8進数値を表示するのが良い考えだったのでしょうか?さらに怒っているのですが、なぜバイト値をこの奇妙な出力形式の対応するASCII文字に置き換えるのでしょうか? – Alderath

答えて

1

私はJavaによって生成されるようSAMERで想定しています。

基本的に: *スペース(0x20の)とチルダ(0x7eの)ASCII文字として扱うとの間にショートカットがある場合(例:\ nは、\ rを、\など)がそう脱出ショートカット *を使用* 文字(8進数)

したがって、上記の\ 377は、1バイト:377オクタルまたは10進数で255です。

"\377\330\377\340 = 255 216 255 224 

あなたは、Java/Cプログラムに文字列をコピーし、

Javaコードはになりそうだバイトに変換することができるはずです。

static String escapeBytes(final ByteSequence input) { 
    final StringBuilder builder = new StringBuilder(input.size()); 
    for (int i = 0; i < input.size(); i++) { 
     final byte b = input.byteAt(i); 
     switch (b) { 
     // Java does not recognize \a or \v, apparently. 
     case 0x07: builder.append("\\a"); break; 
     case '\b': builder.append("\\b"); break; 
     case '\f': builder.append("\\f"); break; 
     case '\n': builder.append("\\n"); break; 
     case '\r': builder.append("\\r"); break; 
     case '\t': builder.append("\\t"); break; 
     case 0x0b: builder.append("\\v"); break; 
     case '\\': builder.append("\\\\"); break; 
     case '\'': builder.append("\\\'"); break; 
     case '"' : builder.append("\\\""); break; 
     default: 
      // Only ASCII characters between 0x20 (space) and 0x7e (tilde) are 
      // printable. Other byte values must be escaped. 
      if (b >= 0x20 && b <= 0x7e) { 
      builder.append((char) b); 
      } else { 
      builder.append('\\'); 
      builder.append((char) ('0' + ((b >>> 6) & 3))); 
      builder.append((char) ('0' + ((b >>> 3) & 7))); 
      builder.append((char) ('0' + (b & 7))); 
      } 
      break; 
     } 
    } 
    return builder.toString(); 
    } 

com.googleから撮影.protobuf.TextFormatEscaper

+0

申し訳ありませんが、お返事には大変感謝しています。 私はそれらを生成するための* nixユーティリティを見つけることができたと思っていましたが、私は自分自身のために何かを鞭打ちしなければならないと思います。 – user691154

+0

プロトコルバッファには、クラス名がJavaに似ている可能性が高い言語のほとんどの形式のコード/デコード方式があります –

関連する問題