Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Прошу помощи в разборках с хешем (binary, info_hash, getBytes, getSomeGemorArray) / 3 сообщений из 3, страница 1 из 1
26.04.2012, 03:28:49
    #37771518
Fagrant
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в разборках с хешем (binary, info_hash, getBytes, getSomeGemorArray)
Прошу прощения, возможно вопрос чайницкий, с Явой знаком третий день.

В качестве учебной задачи выбрал переписывание ретрекера под яву. Условие - нужно включиться "параллельно" уже работающему на php.
Проблема - не могу корректно передать бинарное значение инфохеша в MySQL.

Путь приблизительно такой (несущественные детали опускаю):

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
reqURL = URLDecoder.decode(<запрос клиента из GetURL>, "UTF-8");
// Раскодировали URL строчку

New String sIHash = reqURL.substring(iStrBegin, iStrEnd);
// Вырезали по найденным индексам инфохеш

New byte[] byte_hash = sIHash.getBytes("UTF-8");
// Преобразовали строчку в массив байт

stmt = conn.prepareCall("{CALL TestAction(?)}");
// В оформленном connection подготавливаем и запускаем (потом) стейтмент

stmt.setBytes(1, byte_hash);
// Записали массив байт во входящий параметр процедуры



Проблема в недопонимании. В чем-то туплю, прошу подсказать :) Итак:
1. sIHash.length() - показывает правильную длину хеша (до 20 байт).
2. При System.out.println(sIHash); - выводит что-то очень похожее на нужный мне хеш, при выводе содержит ромбы с знаком "?" (здесь не отображается корректно, поэтому не привел)
3. byte_hash.length уже до 40 байт, что мне уже кардинально непонятно. Соответственно хранимке, принимающей параметр binary(20), это не нравится.

Что пробовал:
1. Использовать в методе getBytes другие кодировки. При двухбайтовых - хранимка ругается, что логично, при однобайтовых частью отрабатывает, но ни один вариант не совпадает с тем, что передает $_GET из php.
Что примечательно(!!!), в косоли Явы выводится такой вид хеша как надо, повторить его таким методом не удалось. Похоже разница в том, что в консоль идет поток байтов а не символов. Но как его выцепить - не представляю.
2. Передача в параметр хранимки сразу строки с помощью stmt.setString(1, sIHash) не помогает, срока опять приходит в кодировке и вдвое длинней.
3. Пробовал в хранимку отдавать строку с помощью URLDecoder.decode, декодируя инфохеш из URL уже на последнем этапе. Приходит больше 20 байт, в кодировке по умолчанию видимо, uft-8.
4. Еще несколько всяких мелких извращений, описывать которые не буду - стыдно.

Дополнение: насколько я понял (в вебе тоже... не силен) до первой выдачи сервером страницы кодировка страниц и URL в частности не определена, используется по умолчанию, поэтому настройки апача и прочего в плане кодировок особого значения не имеют. Работал под убунтой, родная кодировка utf-8.

Подскажите пожалуйста, как правильно пихнуть хранимке binary данные в моем случае?
...
Рейтинг: 0 / 0
26.04.2012, 10:05:48
    #37771712
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в разборках с хешем (binary, info_hash, getBytes, getSomeGemorArray)
Fagrant,

в консоли , скорее всего , cp-1251 кодировка, соответственно unicode символы двубайтовые она ломает.
Вы уверены, что запрос от клиента приходит в utf-8?
...
Рейтинг: 0 / 0
01.05.2012, 09:33:13
    #37777959
Fagrant
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в разборках с хешем (binary, info_hash, getBytes, getSomeGemorArray)
Продолжение темы здесь: Javatalks.ru

Проблема вроде решена, но вопрос не совсем закрыт.
Если у кого-то есть комментарии, буду благодарен.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Прошу помощи в разборках с хешем (binary, info_hash, getBytes, getSomeGemorArray) / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]