Thank you for using my app. The app do not collects any information
Secileが作成したアプリを利用いただきありがとうございます。このアプリはいかなる情報も収集しません。
Thank you for using my app. The app do not collects any information
Secileが作成したアプリを利用いただきありがとうございます。このアプリはいかなる情報も収集しません。
TonightMoonを利用いただきありがとうございます。このアプリが収集する情報とその目的は以下の通りです。
static public boolean copyWithAndroidLoopFalse(InputStream src, OutputStream dst) { byte[] android_loop = {0x41, 0x4E, 0x44, 0x52, 0x4F, 0x49, 0x44, 0x5F, 0x4C, 0x4F, 0x4F, 0x50, 0x3D, 0x74, 0x72, 0x75, 0x65}; while(true) { byte[] raw_page = readPageBytes(src); if (raw_page == null) return false; if (raw_page.length == 0) break; int index = findBytePattern(raw_page, android_loop); if (index >= 0) { //ANDROID_LOOP=trueが見つかったら空白文字に置き換える for(int i=0; i<android_loop.length; i++) { raw_page[index + i] = 0x20; } } try { dst.write(raw_page); } catch (IOException e) { e.printStackTrace(); return false; } } return true; } static private int findBytePattern(byte[] search_byte, byte[] search_pattern) { int byte_length = search_byte.length; int pattern_length = search_pattern.length; for(int i=0; i<=byte_length - pattern_length; i++) { for(int j=0; j<pattern_length; j++) { if (search_byte[i+j] == search_pattern[j]) { if (j == search_pattern.length - 1) { return i; //search_pattern全て一致 } } else { break; } } } return -1; //一致しなかった }
static public boolean isAndroidLoop(InputStream stream) { try { byte[] data = new byte[256]; stream.read(data); String text = new String(data); return text.contains("ANDROID_LOOP=true"); } catch (IOException e) { e.printStackTrace(); return false; } }
public static byte[] readPageBytes(InputStream stream) { try { DataInputStream dis = new DataInputStream(stream); // 読み込めなかったらデータの終わりと判断する byte[] capture_pattern = new byte[4]; if (dis.read(capture_pattern) == -1) return new byte[0]; if (capture_pattern[0]!=0x4f || capture_pattern[1]!=0x67 || capture_pattern[2]!=0x67 || capture_pattern[3]!=0x53) return null; byte[] header = new byte[22]; dis.read(header); byte page_segments = dis.readByte(); int segment_data_bytes = 0; byte[] segment_table = new byte[page_segments]; int segment_table_int[] = new int[page_segments]; for(int i=0; i<page_segments; i++) { segment_table[i] = dis.readByte(); segment_table_int[i] = segment_table[i] & 0xFF; //JavaではByteは符号付き segment_data_bytes += segment_table_int[i]; } byte[][] segment_data = new byte[page_segments][]; for(int i=0; i<page_segments; i++) { segment_data[i] = new byte[segment_table_int[i]]; dis.read(segment_data[i]); } int result_index = 0; int result_bytes = 4 + 22 + 1 + page_segments + segment_data_bytes; byte[] result = new byte[result_bytes]; System.arraycopy(capture_pattern, 0, result, result_index, 4); result_index += 4; System.arraycopy(header, 0, result, result_index, 22); result_index += 22; result[result_index] = page_segments; result_index += 1; System.arraycopy(segment_table, 0, result, result_index, page_segments); result_index += page_segments; for(int i = 0; i<page_segments; i++) { System.arraycopy(segment_data[i], 0, result, result_index, segment_table_int[i]); result_index += segment_table_int[i]; } return result; } catch (IOException e) { e.printStackTrace(); return null; } }
static public boolean isAndroidLoop(InputStream stream) { while(true) { byte[] raw_page = readPageBytes(stream); if (raw_page == null) break; if (raw_page.length == 0) break; String text = new String(raw_page); if (text.contains("ANDROID_LOOP=true")) { return true; } } return false; }