私はAndroidアプリケーションを開発するのが初めてです。私はカメラ モジュールを作成しました。Wi-Fi 経由で JPEG ストリームを出力できます。ファイルサイズが固定されていないため、モジュールはソケットを介して合計バッファを出力します。このような構造:
request cmd ---------------> Android phone socketchannel Camera 20K buffer <--------------- response raw data
JPEG の生データを受信するように ByteBuffer を設定しました。ByteBuffer start に JPEG-star TAG(0xff 0xd8) が表示され、{-1, 40} と JPEG-end TAG {-1, -39} が ByteBuffer に表示されます。x86 システムで C 言語によるテスト プログラムを作成しました。生データ バッファーには少なくとも 1 つのフレームが含まれています。
String method-indexOf() を使用していますが、JPEG の開始/終了タグを検索できません。String メソッドは ASCII 0x00~0x79 のみをサポートするため、サポート関数は 0x80~0xFF をサポートしません。Pattern/Matcher クラスも試してみましたが、同じ結果が得られました。
以下のようなJPEG生データ:
/* JPEG start */
ff d8 ff e1 01 22 45 78 69 66 00 00 49 49 2a 00
/* JPEG end */
43 ac 90 b8 62 3f 0a dd ca e7 9e a3 63 ff d9
私は純粋な C 言語を書いているので、ブロック メモリ内の特定のメモリ パターンを検索できる memmem() 関数があります。JAVA には、 ByteBuffer で extended-ascii を見つけるための同様の方法がありますか?
以下は、パターン/マッチャーを使用して拡張ASCIIパターンを見つけるコードですが、それでも失敗しました:
public static final byte[] jpegEnd = new byte[]{(byte) 0xff, (byte)0xd9};
public static final byte[] jpegStart = {(byte)0xff, (byte)0xd8};
public ByteBuffer bjpegStart = ByteBuffer.allocate(10);
public ByteBuffer bjpegEnd = ByteBuffer.allocate(10);
public String sJpegStart;
public String sJpegEnd;
public String tempStr ;
public ByteBuffer inPut_buf = ByteBuffer.allocate(20500);
private Pattern pattern;
private Matcher matcher;
private int location;
/* initial JPEG-end ASCII string */
bjpegStart.put(jpegStart, 0, 2);
try {
sJpegStart = new String(bjpegStart.array(), "ISO-8859-1");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
bjpegEnd.put(jpegEnd, 0, 2);
try {
sJpegEnd = new String(bjpegEnd.array(), "ISO-8859-1");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ByteBuffer buf = ByteBuffer.allocate(10);
buf.put((byte)outPut_cmd);
buf.flip();
Arrays.fill(inPut_buf.array(), 0, 20499, (byte) 0);
SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress("192.168.0.1", TCP_SERVER_PORT));
socketChannel.write(buf);
if(outPut_cmd==49){
inPut_buf.limit(20480);
socketChannel.read(inPut_buf);
try {
tempStr = new String(inPut_buf.array(), "ISO-8859-1");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
pattern = Pattern.compile(sJpegEnd);
matcher = pattern.matcher(tempStr);
while(matcher.find()){
location = matcher.start();
break;
}
}