从Java向C程序发送byte[]字符串

3

我需要将我的Java信息放入一个字符串中,所以我使用String(byte[] arrB)构造函数。
现在这个信息以char*类型发送到C程序。从我的理解来看,在创建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

你可以看到它们非常相似...


如果您以字节形式读写,则没有编码。 - Scary Wombat
1
你是怎么从C调用Java的?展示给我们代码。如果你从String获取了byte[],那么你可能指定了编码(或者采用了平台的默认值);你需要在C端使用相同的编码方式。 - Jeffrey Bosboom
@ScaryWombat 我需要使用一个String将信息从Java传递到C。 @JeffreyBosboom 我正在开发一个与Linux的libpam通信的程序。为了进行这种通信,我使用了libpam4j包装器。我们可以通过使用pam_conv(对话)将信息从应用程序传递给PAM模块,而唯一的方法是将其放入来自Java端的String中并调用一个libpam4j函数。我没有指定编码... - João Rodrigues
你不需要做任何这样的事情。你需要发送字节,就像它们本来就是的那样。 - user207421
但问题是,当我在每一侧打印尺寸时,它们是不同的,并且Java中的String输出和C中的char*有时存在微小差异,它们并不“相等”。 - João Rodrigues
1个回答

0

由于您没有提供有关Java和C之间传输的详细信息,因此我无法提供完整的响应,只能提供假设。(请提供代码)

首先:

正如Scary Wombat所说,如果要将数据发送到C,请不要使用编码,只需发送字节。

假设1:编码不同

当您将字节编码为字符串时,将使用默认编码。正如Javadoc所述:

通过使用平台的默认字符集解码指定的字节数组构造新的{@code String}

public String(byte bytes[])

如果您需要将字符串发送到char*,请在双方定义编码:

String.getBytes("UTF-8)". 

如果您的Java和C部分使用不同的编码,您将得到不同的结果。

假设2:添加了空字节 如果大小不同(1个字节),那么很可能是您的char*末尾添加了空字节。

假设3:您读取了一些超出数组范围的字符

您如何初始化char*?您是否进行了任何malloc?固定大小缓冲区?也许这是错误的,您读取了另一个缓冲区/变量/...拥有的数据。

假设3': 错过了char*的初始化,您只读取了初始缓冲区值。

不要忘记为您的结构分配内存: 两个示例,说明如何分配结构内存以及何时分配


我无法发送给您代码,因为我正在使用库。我所做的就是调用r.setResp(new String(respons)); r.write();,其中r是pam_response类型。然后在C中,我有相同的pam_response结构体,在那里我执行:pam_response *r; char *text; text=r->resp;。 字符似乎在两侧打印相同的内容,但有时在Java中字符串的大小较小。 - João Rodrigues
没有更多的细节很难帮助您。我们需要了解您使用的结构、显示的字符串以及如何操作(也许错误就在这里?)。请提供两个示例代码和控制台打印信息。 - Manticore
由于截止日期的原因,我现在没有时间做那个。我选择使用数据库而不是传递字符串来完成它。谢谢。你知道我应该怎么处理这个线程吗(关闭它或其他什么)? - João Rodrigues

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接