Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с 16ричной системой счисления, несколько интересных вопросов 
V
    Опции темы
DissDoc
Дата 6.6.2007, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



Вообщем, читаю побайтно файл. И беру значение каждого байта в 16ричном виде... Так вот. Сразу вопросы
1. Туплю - как в long int прибавлять значения байтов. ну т.е. в long int прибавлять 16ричное значение значение (или же все-таки байты???) Как?
2. если long int переполнен - то сдвинуть на 1 значение - а остальные биты обнулить
3. Получить из long int 16ричное значение... в виде 0xZZZZZZZZZZZZZZZZ
PM MAIL WWW   Вверх
LSD
Дата 6.6.2007, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Что ты вообще подразумеваешь под беру значение каждого байта в 16ричном виде? В виде строки, что ли?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
DissDoc
Дата 6.6.2007, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



да. в виде строки ))
PM MAIL WWW   Вверх
Metal_Heart
Дата 6.6.2007, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

Репутация: 4
Всего: 12



DissDoc, если я тебя правильно понял:
1).
Код

 String s = "1234567"; //дана какая-то строка 
 byte[] bytes = s.getBytes();
 long n = 0;
 for(byte b:bytes) n+=b;


2). чего? куда? а главное, зачем?

3). 
Код

System.out.printLn(Long.toHexString(n));



Это сообщение отредактировал(а) Metal_Heart - 6.6.2007, 13:12


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
DissDoc
Дата 6.6.2007, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



2) Сделано для того, что не хватает длины строки =\ нуно 16 символов при переводе из лонга в строку сделать =)
PM MAIL WWW   Вверх
Metal_Heart
Дата 6.6.2007, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

Репутация: 4
Всего: 12



подозреваю, что это понятно только тебе:
Цитата(DissDoc @  6.6.2007,  11:42 Найти цитируемый пост)
2. если long int переполнен - то сдвинуть на 1 значение - а остальные биты обнулить


Цитата(DissDoc @  6.6.2007,  13:18 Найти цитируемый пост)
2) Сделано для того, что не хватает длины строки =\ нуно 16 символов при переводе из лонга в строку сделать =) 


Ты приведи пример или алгоритм действий. 



--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
DissDoc
Дата 6.6.2007, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



Алгоритм таков:
читаю файл побайтно и складываю эти байты в лонг. В результате получаю число... но оно по длине (количество символов) оказалось небольшое. Нужно длину как бы числа в 16 символов. Вопрос (проблема) нужно сделать 16 символов...
Вот я глупо и предположил сделать так
грубо говоря имеем 0x0000000000000000
начинаем к лонгу прибавлять байты, как только лонг заполнился - то его обнуляем, а в итог пишем
0хf00000000000000
ну и так далее... Ну у нас в результате все равно какое-то число будет в лонге, в результате получаем что-то вроде (жирным выделено итоговое значение лонга)
0xff4957dc89000000

НО! Это ужасный способ. Я и спрашиваю как лучше сделать?

Это сообщение отредактировал(а) DissDoc - 6.6.2007, 13:36
PM MAIL WWW   Вверх
Metal_Heart
Дата 6.6.2007, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

Репутация: 4
Всего: 12



Цитата(DissDoc @  6.6.2007,  13:27 Найти цитируемый пост)
грубо говоря имеем 0x0000000000000000
начинаем к лонгу прибавлять байты, как только лонг заполнился - то его обнуляем, а в итог пишем
0хf00000000000000


т.е. при переполнении лонга ты в него пишешь какое-то абстрактное число, далее ты к этому абстр. числу прибавляешь ещё что-то. А если он опять переполнится?

Странно всё это, как-будто тебе совсем не важно что у тебя в лонге хранится.

Как ты думаешь, а сколько тебе байтов надо сложить, чтоб этот лонг переполнился?
По моим подсчетам (возьмем только положительный ряд), если ты будешь к этому лонгу (который был пуст в начале) прибавлять байт, равный "0xFF" тебе придется выполнить 36 170 086 419 038 336 операций (в десятичной системе счисления).

Но если всё же лонг тебе мал, используй два лонга, три, сколько потребуется требуется:
Код

long long1;
long long2;
...
if((long1+newByte)>Long.MAX_VALUE) {long2++; long1=0;} //только для положительных чисел


Это сообщение отредактировал(а) Metal_Heart - 6.6.2007, 14:06


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
DissDoc
Дата 6.6.2007, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



Да, я это понимаю..
Мне по сути не важно что в лонге храниться =)
Я понимаю что у меня идея - хлам. Но больше идей в голове нет =\ 
Просто не знаю как еще можно получить 16 символов (
PM MAIL WWW   Вверх
nornad
Дата 6.6.2007, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



DissDoc, я так понимаю, ты пытаешься сделать что-то вроде хэш-функции. Причём, в жутко извращённом виде. smile
Ну да ладно, проблема не в функции, а, судя по твоим словам, в том, что ты не знаешь, как получить из лонга (который плюсуешь) hex-строку из 18 символов (считая 0х). Но тебе же уже предложили вариант ([B]Metal_Heart[/B])...
Если результирующее значение меньшей длины, чем надо, то ты легко можешь добавить нули:
Код

String hex = Long.toHexString(n);
int len = hex.length();
for( int i = 0; i < 18 - len; ++i )
  hex = "0x0" + hex.substring( 2 );
System.out.println( hex );

Предупреждаю - код сильно неоптимален (надо использовать StringBuffer), но принцип понять легко.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0838 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.