如何在ByteArray中搜索扩展的ascii模式?在JAVA中有memmem()方法吗?

时间:2013-11-01 07:50:44

标签: java android extended-ascii

我是开发Android应用程序的新手。我做了一个相机模块,它可以通过Wi-Fi输出JPEG流。由于文件大小不固定,模块通过套接字输出总缓冲区。结构如下:

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

我设置了一个ByteBuffer来接收JPEG原始数据。我可以在ByteBuffer start中看到JPEG-star TAG(0xff 0xd8),它在ByteBuffer中显示{-1,40}和JPEG-end TAG {-1,-39}。我在x86系统上用C语言编写了一个测试程序,原始数据缓冲区至少包含一个框架。

我使用String方法-indexOf()无法搜索JPEG-start / end标签。因为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?

下面是我的代码使用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;
            }
    }

0 个答案:

没有答案