Как искать расширенный шаблон ascii в ByteArray? есть метод memmem () в JAVA?

Я новичок в разработке приложений для Android. Я сделал модуль камеры, он может выводить поток JPEG через Wi-Fi. Из-за того, что размер файла не фиксирован, модуль выводит общий буфер через сокет. Структура такая:

                     request cmd
                    --------------->
   Android phone      socketchannel        Camera 20K buffer
                    <---------------
                    response raw data

Я установил ByteBuffer для получения необработанных данных JPEG. Я вижу тег звездочки JPEG (0xff 0xd8) в начале байтового буфера, он отображает {-1, 40}, а тег конца JPEG {-1, -39} должен находиться в байтовом буфере. Я написал тестовую программу на языке C в системе x86, буфер необработанных данных содержит как минимум один кадр.

Я использую метод String-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 аналогичный метод поиска расширенного ascii в ByteBuffer?

Ниже мой код использует Pattern / Matcher для поиска расширенного шаблона 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;
            }
    }

person swordfish_yang    schedule 01.11.2013    source источник
comment
Это не имеет ничего общего с ASCII, расширенным ASCII или любой другой кодировкой символов - вы просто хотите сравнить байтовые массивы. Не следует пытаться хранить произвольные двоичные данные в String. Ваши данные не являются символьными данными в кодировке ISO-8859-1.   -  person Jesper    schedule 01.11.2013
comment
stackoverflow.com/questions/1507780/   -  person auselen    schedule 01.11.2013
comment
Дорогой Ауселен, спасибо за вашу огромную помощь. Я могу найти конец буфера JPEG. С Уважением.   -  person swordfish_yang    schedule 04.11.2013