我正在开发基于Java的某个应用程序。 java层与C ++层对话,它执行从数据库形成sql查询的逻辑,并将结果返回给Java层。
用一个更简单的例子:
在java方面
nameField = new JTextField(20) //20 chars max length
name = t.getText() // name is sent to CPP layer
在CPP层上,接收来自java层的名称并将其存储在本地变量cppName中。我对CPP层中使用的变量声明感到困惑。其中大多数都是这样声明的:
char cppName[20*4+1]
我想知道20 * 4 + 1的重要性。将cpp一侧的所有变量声明为大小为javaSize * 4 + 1的原因。
答案 0 :(得分:2)
java代码中的字符是UNICODE吗?如果是这样,单个char
不足以存储UNICODE字符,比率为4:1
。最后一个字符(+1)是空终止符。
因此,在C ++端需要4个字节,即4 char
s来存储单个Java字符,C ++中以char表示的字符串以空值终止(最后一个字符必须是{{1 }}),所以'\0'
。
答案 1 :(得分:2)
如果字符串是通过UTF-8翻译的,则每个字符可以变成4个字节。如果你超出保留的内存,CPP不提供任何保护,你必须采用最差的大小,即使你不相信你每个人都会使用这些字符。
BTW In Java String存储为UTF-16,这意味着它支持65535以上的字符作为使用两个字符的代码点。
http://java.sun.com/developer/technicalArticles/Intl/Supplementary/
当UTF-8编码时,Java中支持的代码点的最长字符变成4个字节。
StringBuilder sb = new StringBuilder();
sb.appendCodePoint(Character.MAX_CODE_POINT);
System.out.println(sb.toString().getBytes("UTF-8").length); // prints 4
虽然这在技术上占用了String中的两个char
。如果你得到最大的字符,你得到3.所以真的4是过于保守(因为需要两个字符才能产生4个字节)
StringBuilder sb = new StringBuilder();
sb.appendCodePoint(Character.MAX_VALUE);
System.out.println(sb.toString().getBytes("UTF-8").length); // prints 3
答案 2 :(得分:1)
Java字符是unicode,所以如果你想将它们作为ascii传递给C,你将不得不这样做 使用string.getBytes(charset()) - 将为您提供所需字符集的字节数组。在C端,您将不得不添加终止空字节 - 因此+1