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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> String <-> byte[] 
V
    Опции темы
v2v
Дата 2.10.2007, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Создаю масив байт, из него создаю строку : 
Код

String str = new String(bb);

но проблема в том что вывод строки даёт что то вроде : 
Код

"[B@d0af9b"

хоть длинна и правильная (384 символа).
Как мне вывести правильную строку, и затем эту строку преобразовать назал в масив байт??

Это сообщение отредактировал(а) v2v - 2.10.2007, 08:49


--------------------
PM   Вверх
AlexeyVorotnikov
Дата 2.10.2007, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(v2v @  2.10.2007,  09:49 Найти цитируемый пост)
вывод строки даёт что то вроде

Ты уверен, что выводишь именно строку?
Код в студию!


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
v2v
Дата 2.10.2007, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



немного не правильно написал : вывожу не строку , а масив байт...
причём это всё дело проходит через сокет, ну вообще вот код: 
Код

            byte[] bb = rsab.Encrypt(key);        
            String str = new String(bb);            
            System.out.println(str);              //всё ОК
            byte[] bb1=str.getBytes(); // вот тут ещё всё в порядке
            out.println(str); <- пишем в сокет            




Код

        sk=in.readLine(); <- читаем из сокета
        byte[] res=sk.getBytes(); 
        System.out.println(res); // а вот тут віводится не верно "[B@d0af9b"



--------------------
PM   Вверх
AlexeyVorotnikov
Дата 2.10.2007, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А как это ты пишешь в сокет через println и читаешь через readLine?


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
v2v
Дата 2.10.2007, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А что не правильно?
Читает BufferedReader наследник java.io.Reader  , а 
Пишет PrintWriter - наследник java.io.Writer . 
Нет, тут всё работает(покрайнемере при передач целых строк). Я вот щас с проблемой столкнулся при переконвертации между масивом байт и строкой ((.

Это сообщение отредактировал(а) v2v - 2.10.2007, 10:27


--------------------
PM   Вверх
AlexeyVorotnikov
Дата 2.10.2007, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ошибка, кажется, в другом месте...

При попытке сконвертировать массив байтов в строку при помощи метода toString (а именно он вызывается в случае System.out.println(res)), на выходе получиться именно что-то вроде "[B@d0af9b".

Добавлено через 1 минуту и 4 секунды
Вообще говоря, ипользовать Wirter и Reader для передачи массива байтов неправильно. Они предназначены для работы с символьными строками.


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
v2v
Дата 2.10.2007, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



вообще то конвертация должна бы происходить тут byte[] res=sk.getBytes(); 
но res.length() < 384 (384 было на входе).

Цитата(AlexeyVorotnikov @  2.10.2007,  10:38 Найти цитируемый пост)

Добавлено через 1 минуту и 4 секунды
Вообще говоря, ипользовать Wirter и Reader для передачи массива байтов неправильно. Они предназначены для работы с символьными строками. 

собственно говоря, я и не передаю масивы байт, я работаю с символьными данными... ошибки где то при перекодировывании.


--------------------
PM   Вверх
Shaggie
Дата 2.10.2007, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

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



Для работы с байтами используй java.io.ByteArrayInputStream и java.io.ByteArrayOutputStream


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
AlexeyVorotnikov
Дата 2.10.2007, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот в этой строчке:
Код

System.out.println(str);              //всё ОК

что выводится?

Добавлено через 1 минуту и 53 секунды
И попробуй после 
Код

sk=in.readLine(); <- читаем из сокета


поставить 
Код

System.out.println(sk);

Что получится?

Это сообщение отредактировал(а) AlexeyVorotnikov - 2.10.2007, 11:22


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
_Michael
Дата 2.10.2007, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(AlexeyVorotnikov @  2.10.2007,  10:38 Найти цитируемый пост)
При попытке сконвертировать массив байтов в строку при помощи метода toString (а именно он вызывается в случае System.out.println(res)), на выходе получиться именно что-то вроде "[B@d0af9b".

Конечно что так! Вот из строки получить массив байт:
Код

String s = "My String"
byte[] bytes = s.getBytes();
//или
bytes = s.getBytes("UTF-8");

наоборот, из массива байт строку:
Код

byte[] bytes = socket.getInputStream().read(6);//ето просто чтоб показать что здесь у нас чистые сырие байты
String str = new String(bytes);
//или
str = new String(bytes, "UTF-8");

и все, больше ничего не надо.

Это сообщение отредактировал(а) _Michael - 2.10.2007, 22:13


--------------------
...не убивайся ни о чем - все временно,
хоть ночь темна но светлым днем беременна...

Саади
PM MAIL   Вверх
_Michael
  Дата 2.10.2007, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(v2v @  2.10.2007,  09:07 Найти цитируемый пост)
byte[] res=sk.getBytes(); 
        System.out.println(res); // а вот тут віводится не верно "[B@d0af9b"

конечно что неверно!!! тоесть наверно не совсем то что ожыдалось ты здесь в метод println() передаеш твой массив байт, но в консоль ведь строка печатается. поетому если в качестве параметра в println() а точнее в print() передавать какой то другой тип данных то вызывается метод toString() на том обьекте который ты передаеш. который и возвращает строку которая будет печататься в консоли. НО, для массива байт етот метод не переопределен, поетому по умолчанию вызывается метод Object'a, который работает следующим образом:
Код

getClass().getName() + '@' + Integer.toHexString(hashCode())

вот ты и имееш строку вида [B@d0af9b где [B означает что ето массив байт а d0af9b шестнадцатеричное представление хеш-кода.

Это сообщение отредактировал(а) _Michael - 2.10.2007, 22:16


--------------------
...не убивайся ни о чем - все временно,
хоть ночь темна но светлым днем беременна...

Саади
PM MAIL   Вверх
v2v
Дата 3.10.2007, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



_Michael, спасибо за разьяснения.

Решёл всё по другому. Проблему я изначально правильно опеределил, но как то не обратил внимания.
Дело в том что я генерирую "случайный" набор из 384 байт и понятное дело там могут быть байт 0 , так при переконвертации в строку этот строка обрубается по этому байту и дальше не записывается... вот почему у меня на выходе длинна строки всегда меньше нужной была.

всем спасибо за обсуждение.


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

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

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


 




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


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

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