powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по кодировкам
2 сообщений из 2, страница 1 из 1
Вопрос по кодировкам
    #37882775
hello_amigo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. Есть криптографическая dll библиотека (WinLib.dll). Для доступа к её функциям я создал промежуточную библиотеку для доступа к WinLib.dll через jni. В WinLib.dll есть функция sign(char *data, char *msg, int msgLen). После выполнения sign, в msg записываются данные, в msgLen значение 717. Msg я возвращаю в java код как byte[]. Код для тестирования функций библиотеки:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class Test {
   public static void main(String[] args) {
      SecurityJavaGateway gate = new SecurityJavaGateway();  // System.load(".."); // загрузка промежуточной библиотеки 
      gate.init();     // загрузка WinLib.dll

      // вызов функции промежуточной библиотеки. Вызов функции sign WinLib.dll
      byte[] msg = gate.signData("test");   // msg.length == 717
      
      String str = new String(msg);   // str.length() == 5

      Charset.defaulCharset().name(); // windows-1251
      
      
   }
}



Пробовал возвращать из signData не byte[], а String. Из кода промежуточной библиотеки для signData делаю так:

......
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
char str[msgLen];    
for (int i = 0; i < msgLen; i++) {
    str = msg[i];
}

jstring result = env->NewStringUTF(str);
return result;



Теперь тестовый файл:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public class Test {
   public static void main(String[] args) {
      SecurityJavaGateway gate = new SecurityJavaGateway();
      gate.init();
      String msg = gate.signData("test");   // msg.length() == 356
      
   }
}



Собственно вопрос. Почему получается так, что new String(msg) "обрезает" байты?
Почему во втором случае (когда возвращается String) колличество байт в 2 раза меньше?
[i]Видимо в с++ char занимает 1 байт. Когда создаётся строка в java, то для каждого символа используется 2 байта. Причём, как я понял, берётся 2 символа, которые занимают по байту, и "соединяются" в один символ из 2 байт

Как можно сделать так, чтобы значение msg, полученное из функции dll-библиотеки занимало тоже 717 байт и не обрезалось?

Спасибо за помощь!!!
...
Рейтинг: 0 / 0
Вопрос по кодировкам
    #37882797
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hello_amigo,

Видимо надо или при конвертации из и в byte[] указывать кодировку, или что-то настроить на этапе связи с dll (про это не знаю), чтобы данные конвертировались автоматически.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по кодировкам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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