Мое решение состояло бы в том, чтобы сделать анализ экранных данных бесполезным путем включения примерно 10-минутной задержки 'ботов и сценариев.
Вот то, как я сделал бы это:
Вы не должны регистрировать каждый IP-адрес в каждый хит. Только отследите один из каждых 20 хитов или около этого. Рецидивист все еще обнаружится в рандомизированном случайном отслеживании.
Сохраняют кэш Вашей страницы от приблизительно на 10 минут ранее.
, Когда repeat-hitter/bot поразит Ваш сайт, дайте им 10-минутную старую кэшируемую страницу.
Они не будут сразу знать, что получают старый сайт. Они смогут очистить его, и все, но они не будут больше выигрывать гонок, потому что "у настоящих людей" будет 10-минутное преимущество.
Преимущества:
Недостатки
, Что Вы думаете?
Тебе повезло. Мне пришлось сделать это пару месяцев назад. Вот упрощенная версия, которая принимает два параметра из командной строки. Оба параметра командной строки являются именами файлов ... первый - это входной файл, а второй - выходной файл. Входной файл читается в двоичном формате, а выходной файл записывается в шестнадцатеричном формате 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();
}
}
}
В Java есть обширная библиотека для чтения / записи и редактирования изображений. Посмотрите на пакеты javax.imageio
(здесь документация ). Вероятно, вы захотите создать BufferedImage
, используя ImageIO
, а затем получить доступ к данным изображения из объекта BufferedImage
(для этого есть методы).
Если вам нужен общий ответ для любого типа двоичных данных (а не только изображений), тогда, я думаю, вам придется прочитать содержимое файла в массиве байтов. Примерно так:
byte[] bytes = new byte[in.available()];
in.read(bytes);
Если вы введете "шестнадцатеричное кодирование Java" в поиске Google, первым результатом будет http://commons.apache.org/codec/api-release/org/apache/ commons / codec / binary / Hex.html , который вы должны использовать, чтобы ответить на часть вашего вопроса «Я хочу преобразовать pic.bmp в массив шестнадцатеричных значений».
Я не понимаю, как это поможет вам с тем, «чтобы я мог отредактировать и сохранить его как измененную версию». Для этого вам, вероятно, следует использовать шестнадцатеричный редактор. например. ghex2
Если вы хотите возиться с байтами самостоятельно, получите FileChannel из FileInputStream, затем выделите ByteBuffer и затем прочтите в него все содержимое. ByteBuffer также имеет методы для работы с большими блоками байтов в двух разных порядках байтов.