套接字:将无符号字符数组从 C 传递到 JAVA

Posted

技术标签:

【中文标题】套接字:将无符号字符数组从 C 传递到 JAVA【英文标题】:Sockets: Passing unsigned char array from C to JAVA 【发布时间】:2014-12-07 08:59:03 【问题描述】:

C端:

unsigned char myBuffer[62];
fread(myBuffer,sizeof(char),62,myFile);
send(mySocket, myBuffer, 62,0);

JAVA端:

bufferedReader.read(tempBuffer,0,62);

现在在 JAVA 程序中,我在 C 程序中接收(使用套接字)值小于 0x80 没有问题,但我在 C 程序中收到等于或大于 0x80 的所有值的 0xFD 值。 我需要完美解决这个问题。

【问题讨论】:

Java 在字符编码方面比 C 更明确。您必须知道您的 C 程序使用的字符编码,以便您的 Java 程序使用相同的编码来解释字节。 @Raedwald 如果这是文本而不是二进制数据; OP不告诉 好的,那你告诉我们你想做什么呢?对我来说,这看起来像 XY problem 我想将字节流从 C 程序传递到 JAVA 程序,InputStream 解决了我的问题。谢谢! @fge 【参考方案1】:

不要使用Reader 读取字节,使用InputStream

Reader 用于读取字符;它接收字节流并(尝试并)将这些字节转换为字符;你会丢失原始字节。

更详细地说,Reader 将使用CharsetDecoder;此解码器配置为使未知字节序列为replaced;并且这里使用的编码可能会用字符 0x00fd 替换未知字节序列,因此是你的结果。

另外,你不关心有符号与无符号; 1000 0000 在 C 中可能是 128 作为 unsigned char,在 Java 中可能是 -127 作为 byte,它仍然是 1000 0000


如果您发送的确实是文本,那么这意味着您选择的用于解码的字符集不是好的字符集;您必须知道原始系统上的文件所使用的编码。

【讨论】:

以上是关于套接字:将无符号字符数组从 C 传递到 JAVA的主要内容,如果未能解决你的问题,请参考以下文章

将无符号字节流转换为有符号字节流 Golang

将无符号字符数组返回到主函数

将无符号整数输入属性传递给顶点着色器

将无符号字符附加到向量会更改其值

如何将无符号字符数组存储为浮点值?

如何将无符号字符数组解析为数值数据