Отправить байт [] в строке из Java в программу C

Мне нужно поместить информацию о Java в строку, поэтому я использую конструктор String(byte[] arrB). Теперь эта информация отправляется программе C как тип char*. Теперь мне нужно вернуть исходные байты, так как, насколько я понимаю, они были закодированы в процессе создания Java String.

Как я могу сделать это в программе C?

Итак, на стороне C у меня есть эти байты:

7e 53 e9 94 d4 46 f5 7c 66 cf 85 34 18 5a ff 6 2d a3 89 48 d2 e4 46 b8 6b 43 ec 64 3a 67 f9 2 6d 12 ac e7 0 c4 99 52 68 76 76 77 12 2 de 7d 5b e7 4e 5 6 73 f4 fc 91 54 12 71 64 7a 25 3d

Они находятся в char*, но достигают Java как строку, а строка:

7E 53 EF BF BD EF BF BD 46 EF BF BD 7C 66 CF 85 34 18 5A EF BF BD 06 2D EF BF BD EF BF BD 48 EF BF BD EF BF BD 46 EF BF BD 6B 43 EF BF BD 64 3A 67 EF BF BD 02 6D 12 EF BF BD EF BF BD

Как видите, много общего...


person João Rodrigues    schedule 19.12.2014    source источник
comment
если вы читаете и пишете как байты, кодировка отсутствует   -  person Scary Wombat    schedule 19.12.2014
comment
Как вы вызвали Java из C? Покажите нам код. Если вы получили byte[] из строки, вы, вероятно, указали кодировку (или взяли кодировку по умолчанию для платформы); вам нужно будет использовать эту кодировку на стороне C.   -  person Jeffrey Bosboom    schedule 19.12.2014
comment
@ScaryWombat Мне нужно использовать строку для переноса информации с Java на C. @JeffreyBosboom Я разрабатываю программу, которая взаимодействует с Linux libpam. Я использовал оболочку libpam4j для этого сообщения. Мы можем передавать информацию из приложения в модуль PAM, используя pam_conv (разговоры), и единственный способ — поместить ее в строку со стороны Java и вызвать функцию libpam4j. Кодировку не указал...   -  person João Rodrigues    schedule 19.12.2014
comment
Вам не нужно делать ничего подобного. Вам нужно отправить байты, как они есть.   -  person user207421    schedule 19.12.2014
comment
Но дело в том, что когда я печатаю размеры с каждой стороны, они разные, и вывод String в Java и char* в C иногда не совпадает с небольшими отличиями.   -  person João Rodrigues    schedule 19.12.2014


Ответы (1)


Поскольку вы не предоставили подробностей о передаче между java и C, я не могу дать вам полный ответ, только предположения. (пожалуйста, укажите код)

Первые пункты: Как сказал Scary Wombat, если вы хотите отправить данные на C, не используйте кодировку, просто отправьте байты.

Предположение 1: Кодирование не то же самое

Когда вы кодируете свои байты в строку, вы будете использовать кодировку по умолчанию. Как говорит javadoc:

Создает новую {@code String}, декодируя указанный массив байтов, используя кодировку платформы по умолчанию.

общедоступная строка (байтовые байты [])

Если вам нужно отправить строку в char*, определите кодировку для обеих сторон:

String.getBytes("UTF-8)". 

Если ваша часть java и c использует другую кодировку, вы получите разницу в результате.

Предположение 2: добавлен нулевой байт. Если размер отличается (1 байт), вероятно, это нулевой байт в конце вашего char*.

Предположение 3: вы прочитали какой-то символ, который находится вне вашего массива

Как вы сделали инициализацию вашего char* ? Вы какой-нибудь malloc? Буфер фиксированного размера? Возможно, это неправильно, и вы читаете другие данные, принадлежащие другому буферу/переменной/....

Предположение 3': Пропустите инициализацию char*, вы только что прочитали начальное значение буфера.

Не забудьте выделить память для вашей структуры: Два примера того, как выделить память структуры и когда< /а>

person Manticore    schedule 19.12.2014
comment
Я не могу отправить вам код, так как использую библиотеку. Все, что я делаю, это вызываю r.setResp(new String(respons)); r.write();, где r — это тип pam_response. Затем на C у меня есть та же структура pam_response, что и у меня: pam_response *r; char *text; text=r->resp; Кажется, что символы печатают одно и то же с каждой стороны, но иногда в Java размер строки меньше. - person João Rodrigues; 19.12.2014
comment
Трудно помочь вам без более подробной информации. Нам нужна информация о структуре, которую вы используете, строке, которую вы отображаете, и о том, как (может быть, здесь ошибка?) Дайте два примера кода и распечатайте консоль. - person Manticore; 21.12.2014
comment
У меня сейчас нет на это времени из-за дедлайнов, я решил сделать это другим способом, используя базу данных и не передавая строки. Спасибо. Вы знаете, что мне делать с этой веткой (закрыть ее или что-то в этом роде)? - person João Rodrigues; 21.12.2014