Страницы

Поиск по вопросам

суббота, 8 февраля 2020 г.

Реализация в Java сигнатуры метода?

#java #методы


Как этот метод реализовать на java. 
Нужен для того чтобы проверить кодировку файлов на битовом уровне.
Код:
unc ::IsUTF8(unc *cpt) { if (!cpt) return 0;

if ((*cpt & 0xF8) == 0xF0) { // start of 4-byte sequence
    if (((*(cpt + 1) & 0xC0) == 0x80)
     && ((*(cpt + 2) & 0xC0) == 0x80)
     && ((*(cpt + 3) & 0xC0) == 0x80))
        return 4;
}
else if ((*cpt & 0xF0) == 0xE0) { // start of 3-byte sequence
    if (((*(cpt + 1) & 0xC0) == 0x80)
     && ((*(cpt + 2) & 0xC0) == 0x80))
        return 3;
}
else if ((*cpt & 0xE0) == 0xC0) { // start of 2-byte sequence
    if ((*(cpt + 1) & 0xC0) == 0x80)
        return 2;
}
return 0;
}

Вопрос:


Как трансформировать этот метод в
   Java code?
    


Ответы

Ответ 1



постарался максимально облегчить вашу задачу: // на счет значения не уверен, подставьте нужное private static final int UTF8_HEADER_SIZE = 8 ; public static boolean isUTF8 (String path) { return isUTF8(new File(path)) ; } public static boolean isUTF8 ( File file ) { // validate input if (null == file) { throw new IllegalArgumentException ("input file can't be null"); } if (file.isDirectory ()) { throw new IllegalArgumentException ("input file refers to a directory"); } // read input file byte [] buffer = new byte[UTF8_HEADER_SIZE]; try { readBytes(file, buffer) ; } catch ( IOException e ) { throw new IllegalArgumentException ("Can't read input file, error = " + e.getLocalizedMessage () ); } // validate file header // TODO: your validation goes here // if (0xF0 == (buffer[0] & 0xF8) ) { // } return false ; } private static void readBytes ( File input, byte[] buffer ) throws IOException { if (null == buffer || 0 == buffer.length) { return; } // read data FileInputStream fis = new FileInputStream ( input ) ; fis.read ( buffer ) ; fis.close (); }

Ответ 2



Смотрите. Для массивов в Java используется класс ArrayList. Битовые операции те же, только для беззнакового сдвига влево используется >>> (но вам это не нужно). Вместо адресной арифметики применяйте индексирование. Передать что-то типа указателя в середину массива невозможно, просто передавайте массив и начальный индекс. Сигнатура: // внутри класса public static int IsUTF8(ArrayList cpt, int startIndex) { // ... Дальше сами :-)

Ответ 3



После непростого поиска, результат (сын ошибок трудных :) ) проверки кодировки UTF-8: class EncodingsCheck implements Checker { @Override public boolean check(File currentFile) { return isUTF8(currentFile); } public static boolean isUTF8(File file) { // validate input if (null == file) { throw new IllegalArgumentException("input file can't be null"); } if (file.isDirectory()) { throw new IllegalArgumentException( "input file refers to a directory"); } // read input file byte[] buffer; try { buffer = readUTFHeaderBytes(file); } catch (IOException e) { throw new IllegalArgumentException( "Can't read input file, error = " + e.getLocalizedMessage()); } if (0 == (buffer[0] & 0x80)) { return true; // ASCII subset character, fast path } else if (0xF0 == (buffer[0] & 0xF8)) { // start of 4-byte sequence if (buffer[3] >= buffer.length) { return false; } if ((0x80 == (buffer[1] & 0xC0)) && (0x80 == (buffer[2] & 0xC0)) && (0x80 == (buffer[3] & 0xC0))) return true; } else if (0xE0 == (buffer[0] & 0xF0)) { // start of 3-byte sequence if (buffer[2] >= buffer.length) { return false; } if ((0x80 == (buffer[1] & 0xC0)) && (0x80 == (buffer[2] & 0xC0))) { return true; } } else if (0xC0 == (buffer[0] & 0xE0)) { // start of 2-byte sequence if (buffer[1] >= buffer.length) { return false; } if (0x80 == (buffer[1] & 0xC0)) { return true; } } return false; } private static byte[] readUTFHeaderBytes(File input) throws IOException { // read data FileInputStream fileInputStream = new FileInputStream(input); try{ byte firstBytes[] = new byte[4]; int count = fileInputStream.read(firstBytes); if(count < 4){ throw new IOException("Empty file"); } return firstBytes; } finally { fileInputStream.close(); } } }

Комментариев нет:

Отправить комментарий