Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/40: Рейтинг темы: голосов - 40, средняя оценка - 4.70
2 / 2 / 1
Регистрация: 29.11.2012
Сообщений: 143

Преобразовать строку бит в строку байт в кодировке utf8

12.05.2016, 16:22. Показов 7461. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!
Пишу программу шифровки/расшифровки DES (лабораторная работа)
Осталось решить один момент.
Когда я читаю текст из файла использую:
Java
1
2
3
Path path = file.toPath();
        byte[] data = Files.readAllBytes(path);//Считали массив файл, как массив байт
        String content = new String(data, StandardCharsets.UTF_8);//Преобразовали массив байт в строку
И программа мне прекрасно распознает как русские так и английские символы. Проблема возникла в самом конце при расшифровке.
у меня на выходе имеется строка бит, уже после всех процедур расшифровки. т.е. я имею расшифрованную строку бит. Мне осталось перевести ее в байты и, собственно в символы. Вот тут проблема и возникла. Я могу в ручную разбивая строку по 8 бит расшифровывать латиницу. Или разбивая по 16 бит, расшифровывать кириллицу.
Подскажите пожалуйста, метод при котором будет производиться перевод с учетом utf8, подобно тому, как я читала из файла.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.05.2016, 16:22
Ответы с готовыми решениями:

Получить UTF8-строку из элементов массива (тип Байт)
Есть одномерный массив байтов (к примеру из десяти элементов). При этом Элемент 1 и Элемент 2 - вместе образуют байты кода UTF8-символа...

Принудительно преобразовать строку в UTF8
Получаю целиком в строку содержимое текстового файла. Эти файлы далеко не всегда созданы в utf8, возможны другие кодировки (в том числе...

Преобразовать строку в последовательность бит
Привет всем! Тема хоть и заезженная, но того что я ищу (примеров) я не нашел. Задача: ввести произвольную строку и перевести ее в 0/1...

7
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
12.05.2016, 17:11
Цитата Сообщение от Vashtanerada Посмотреть сообщение
Я могу в ручную разбивая строку по 8 бит расшифровывать латиницу
Разбивайте по 8 бит и укладывайте в байты.
После чего весь массив байтов аналогично скармливаете в конструктор String.
1
2 / 2 / 1
Регистрация: 29.11.2012
Сообщений: 143
12.05.2016, 19:05  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
Разбивайте по 8 бит и укладывайте в байты.
После чего весь массив байтов аналогично скармливаете в конструктор String.
Я делаю так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
String decod = "";
        String str = "";
        //После каждого 8го бита вставляем пробел
        for(int i = 0; i<dec.length(); i++) {
            if (i != 0) {
                if ((i % 8) == 0) {
                    str += " " + dec.charAt(i);//добавляем элементы в массив
                }
                else str += dec.charAt(i);
            }else str += dec.charAt(i);
        }
        String[] mas = str.split(" ");
        int[] masB = new int[mas.length];
        int n = 0;
        String s = "";
        for(int i = 0; i<dec.length()/8; i++) {
            s = mas[i];
            n = Integer.parseInt(s,2);
            masB[i] = n;
            decod += (char)n;
        }
        for(int i = 0; i<dec.length()/8; i++) {
            System.out.print(masB[i]  + " ");
        }
т.е. я разбиваю строку на биты. Потом каждый бит, перевожу в байт и преобразую в символ, в том случае латиница переводиться хорошо, но с кириллицей проблемы и оно понятно, ведь символы кириллицы занимают 16 бит, а не 8. И я не совсем понимаю, как имея строку 0 и 1 понять, в какой момент появляются русские буквы.
Была бы признательна, если бы вы написали пример.

Добавлено через 1 час 44 минуты
Попробовала сделать, но, видимо, где-то не так сделала. Вот то что я делаю:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//Первеод битовой строки в связный текст
    public static String decoding(String dec){
        String decod = "";
        String str = "";
        //После каждого 8го бита вставляем пробел
        for(int i = 0; i<dec.length(); i++) {
            if (i != 0) {
                if ((i % 8) == 0) {
                    str += " " + dec.charAt(i);//добавляем элементы в массив
                }
                else str += dec.charAt(i);
            }else str += dec.charAt(i);
        }
        String[] mas = str.split(" ");
        int[] masB = new int[mas.length];
        byte[] masByte = new byte[masB.length];
        int n = 0;
        String s = "";
        for(int i = 0; i<dec.length()/8; i++) {
            s = mas[i];
            n = Integer.parseInt(s,2);
            masB[i] = n;
            //decod += (char)n;
        }
 
        for(int i = 0; i<dec.length()/8; i++) {
            masByte[i] += masB[i];
        }
        decod = new String(masByte, StandardCharsets.UTF_8);
        for(int i = 0; i<dec.length()/8; i++) {
            System.out.print(masByte[i]  + " ");
        }
        return decod;
    }
И вот что он у меня выдает:
Code
1
2
3
84 104 101 32 119 111 111 100 115 13 10 -1 -1 -1 -48 -1 -1 -1 -101 -1 -1 -1 -48 -1 -1 -1 -75 -1 -1 -1 -47 -1 -1 -1 -127 0 Сообщение:
The woods
????????????????????????
Где знаки вопроса, должно быть слово "Лес", а строка байт должна выглядеть следующим образом:
84 104 101 32 119 111 111 100 115 13 10 -48 -101 -48 -75 -47 -127

Добавлено через 4 минуты
И я предполагаю, что это связано опять же с тем, что на символ кириллицы требуется 16 бит, а разбиваю по 8 бит
0
 Аватар для HOBATOP
323 / 310 / 206
Регистрация: 14.09.2015
Сообщений: 827
12.05.2016, 23:22
Vashtanerada, смотрите, есть вот такой вариант:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class CodeUTF8 {
    static Charset utf8 = Charset.forName("UTF-8");
 
    public static void main(String[] args) {
        byte[] ch = {84, 104, 101, 32, 119, 111, 111, 100, 115, 13, 10, -48, -101, -48, -75, -47, -127};
        System.out.println(decode(ch));
        System.out.println(Arrays.toString(coder("Лес")));
    }
 
    public static String decode(byte[] ch) {
        return new String(ch, utf8);
    }
 
    public static byte[] coder(String str) {
        return str.getBytes(utf8);
    }
}
после отработки этот класс выдаёт следующее:
Java
1
2
3
The woods
Лес
[-48, -101, -48, -75, -47, -127]
Нормально будет?
1
2 / 2 / 1
Регистрация: 29.11.2012
Сообщений: 143
12.05.2016, 23:45  [ТС]
Цитата Сообщение от HOBATOP Посмотреть сообщение
Нормально будет?
Да, это именно то что нужно, только у меня проблема возникла.
Я пишу так:
Java
1
2
3
4
static Charset utf8 = Charset.forName("UTF-8");
 
byte[] masByte = new byte[masB.length];
String decod = new String(masByte, utf8);
На латиницу так же хорошо срабатывает, на кириллицу выдает набор вопросительных знаков.
0
 Аватар для HOBATOP
323 / 310 / 206
Регистрация: 14.09.2015
Сообщений: 827
12.05.2016, 23:58
Vashtanerada,
Цитата Сообщение от Vashtanerada Посмотреть сообщение
только у меня проблема возникла
сложно сказать что-то, может у Вас где-то до стадии декодирования ошибка? Попробуйте в предложенном классе закодировать строку и сравнить свои биты и то, что получите. По крайней мере у меня слово "Лес" было декодировано и закодировано обратно без ошибок.

Добавлено через 7 минут
Ещё раз проверил: прекрасно кодирует и декодирует хоть латиницу, хоть кириллический, хоть смешанный текст.
0
2 / 2 / 1
Регистрация: 29.11.2012
Сообщений: 143
13.05.2016, 00:00  [ТС]
Цитата Сообщение от HOBATOP Посмотреть сообщение
может у Вас где-то до стадии декодирования ошибка?
У меня получается, при переводе строки бит в байт, происходит неверный перевод из двоичной системы в десятичную
Java
1
2
3
4
5
6
7
8
9
int[] masB = new int[mas.length];
int n = 0;
        String s = "";
        for(int i = 0; i<dec.length()/8; i++) {
            s = mas[i];
            n = Integer.parseInt(s,2);
            masB[i] = n;
            //decod += (char)n;
        }
Я понимаю, что связанно это с тем, что для символа кириллицы используются 16 бит, а у меня массив каждый элемент mas содержит 8 бит, но как в таком случае поступать я не представляю. Как объяснить программе на какой стадии ей нужно собирать не по 8, а по 16 бит?
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
13.05.2016, 09:45
Vashtanerada, по вашему коду невозможно понять где проблема.
Советую забыть про строки для начала, и отладить ваше шифрования на произвольный массивах байтов.
Попробовать руками создать тесты с разными наборами байтов. И уже после того как убедитесь, что ваши методы
Java
1
2
byte[] cipher(byte[] plain);
byte[] decipher(byte[] crypted);
работают как надо, переходите к строкам
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.05.2016, 09:45
Помогаю со студенческими работами здесь

Массив байт преобразовать в строку (C++)
Имеется массив символов array&lt;Byte&gt; Необходимо все содержимое перенести в строку типа System.String как это сделать средствами дотнета? ...

Не получается преобразовать строку к нужной кодировке после перехода на php 5.6
Привет! Сайт работает в кодировке windows-1251. Переключил пхп на версию 5.6, сайт начал отображаться крякозяблами. Почитал в...

Как преобразовать строку-символ-байт
keybd_event(ord('F'), 0, 0, 0); F - символ, ord - его численное представление Вот в чем проблема: Изначально символ содержится в...

Перекодировать строку из кодировки KOI в строку в кодировке Windows-1251 и обратно
Составить программы, печатающие результаты вычислений. Ребят помогите это задание сделать!

Поделить строку на блоки по 12 бит и заменить в каждом блоке случайный бит
На входе есть строка типа string, каждый символ нужно перевести в последовательность битов, и эту последовательность разделить на блоки по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru