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;
}