Java: файл для преобразовывания в шестнадцатеричную систему?

Мое решение состояло бы в том, чтобы сделать анализ экранных данных бесполезным путем включения примерно 10-минутной задержки 'ботов и сценариев.

Вот то, как я сделал бы это:

  • Журнал и идентифицируют любых повторных нападающих.

Вы не должны регистрировать каждый IP-адрес в каждый хит. Только отследите один из каждых 20 хитов или около этого. Рецидивист все еще обнаружится в рандомизированном случайном отслеживании.

  • Сохраняют кэш Вашей страницы от приблизительно на 10 минут ранее.

  • , Когда repeat-hitter/bot поразит Ваш сайт, дайте им 10-минутную старую кэшируемую страницу.

Они не будут сразу знать, что получают старый сайт. Они смогут очистить его, и все, но они не будут больше выигрывать гонок, потому что "у настоящих людей" будет 10-минутное преимущество.

Преимущества:

  • Никакая стычка или проблемы для пользователей (как КАПЧИ).
  • Реализованный полностью на серверной стороне. (никакая уверенность в Javascript/Flash)
  • Подавание более старой, кэшируемой страницы должно быть меньшим количеством производительности, интенсивной, чем живая страница. Можно на самом деле уменьшить нагрузку на серверы этот путь!

Недостатки

  • Требуют, чтобы отслеживание некоторых IP-адресов
  • Потребовало хранения и поддержания кэша более старых страниц.

, Что Вы думаете?

9
задан BinRoot 21 August 2009 в 23:06
поделиться

4 ответа

Тебе повезло. Мне пришлось сделать это пару месяцев назад. Вот упрощенная версия, которая принимает два параметра из командной строки. Оба параметра командной строки являются именами файлов ... первый - это входной файл, а второй - выходной файл. Входной файл читается в двоичном формате, а выходной файл записывается в шестнадцатеричном формате ASCII. Надеюсь, вы сможете адаптировать это под свои нужды.

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;

public class BinToHex
{
    private final static String[] hexSymbols = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };

    public final static int BITS_PER_HEX_DIGIT = 4;

    public static String toHexFromByte(final byte b)
    {
        byte leftSymbol = (byte)((b >>> BITS_PER_HEX_DIGIT) & 0x0f);
        byte rightSymbol = (byte)(b & 0x0f);

        return (hexSymbols[leftSymbol] + hexSymbols[rightSymbol]);
    }

    public static String toHexFromBytes(final byte[] bytes)
    {
        if(bytes == null || bytes.length == 0)
        {
            return ("");
        }

        // there are 2 hex digits per byte
        StringBuilder hexBuffer = new StringBuilder(bytes.length * 2);

        // for each byte, convert it to hex and append it to the buffer
        for(int i = 0; i < bytes.length; i++)
        {
            hexBuffer.append(toHexFromByte(bytes[i]));
        }

        return (hexBuffer.toString());
    }

    public static void main(final String[] args) throws IOException
    {
        try
        {
            FileInputStream fis = new FileInputStream(new File(args[0]));
            BufferedWriter fos = new BufferedWriter(new FileWriter(new File(args[1])));

            byte[] bytes = new byte[800];
            int value = 0;
            do
            {
                value = fis.read(bytes);
                fos.write(toHexFromBytes(bytes));

            }while(value != -1);

            fos.flush();
            fos.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}
19
ответ дан 4 December 2019 в 09:14
поделиться

В Java есть обширная библиотека для чтения / записи и редактирования изображений. Посмотрите на пакеты javax.imageio (здесь документация ). Вероятно, вы захотите создать BufferedImage , используя ImageIO , а затем получить доступ к данным изображения из объекта BufferedImage (для этого есть методы).

Если вам нужен общий ответ для любого типа двоичных данных (а не только изображений), тогда, я думаю, вам придется прочитать содержимое файла в массиве байтов. Примерно так:

byte[] bytes = new byte[in.available()];
in.read(bytes);
3
ответ дан 4 December 2019 в 09:14
поделиться

Если вы введете "шестнадцатеричное кодирование Java" в поиске Google, первым результатом будет http://commons.apache.org/codec/api-release/org/apache/ commons / codec / binary / Hex.html , который вы должны использовать, чтобы ответить на часть вашего вопроса «Я хочу преобразовать pic.bmp в массив шестнадцатеричных значений».

Я не понимаю, как это поможет вам с тем, «чтобы я мог отредактировать и сохранить его как измененную версию». Для этого вам, вероятно, следует использовать шестнадцатеричный редактор. например. ghex2

1
ответ дан 4 December 2019 в 09:14
поделиться

Если вы хотите возиться с байтами самостоятельно, получите FileChannel из FileInputStream, затем выделите ByteBuffer и затем прочтите в него все содержимое. ByteBuffer также имеет методы для работы с большими блоками байтов в двух разных порядках байтов.

0
ответ дан 4 December 2019 в 09:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: