Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
套接字上下文中的Java和二进制数据_Java_Sockets_Binary_Bytearray - Fatal编程技术网

套接字上下文中的Java和二进制数据

套接字上下文中的Java和二进制数据,java,sockets,binary,bytearray,Java,Sockets,Binary,Bytearray,这里是Java新手。是否有任何帮助函数可以序列化字节数组中的数据和字节数组外的数据?我正在编写一个实现网络协议的Java包。所以我必须在循环中编写一些典型的变量,比如版本(1byte)、序列号(long)和二进制数据(bytes)。如何在Java中实现这一点?从C开始,我考虑创建一个所需大小的字节数组,然后由于没有memcpy(),我将long转换为一个临时字节数组,然后将其复制到实际的字节数组中。它看起来效率很低,而且很容易出错。是否有一个类可以用来将参数整理和反整理成字节数组 还有,为什么所

这里是Java新手。是否有任何帮助函数可以序列化字节数组中的数据和字节数组外的数据?我正在编写一个实现网络协议的Java包。所以我必须在循环中编写一些典型的变量,比如版本(1byte)、序列号(long)和二进制数据(bytes)。如何在Java中实现这一点?从C开始,我考虑创建一个所需大小的字节数组,然后由于没有memcpy(),我将long转换为一个临时字节数组,然后将其复制到实际的字节数组中。它看起来效率很低,而且很容易出错。是否有一个类可以用来将参数整理和反整理成字节数组

还有,为什么所有套接字类只处理char[],而不处理byte[]?根据定义,套接字还必须处理二进制数据。这在Java中是如何实现的

我确信我缺少的是Java思维方式。如果有人能指给我看,我会很感激的

编辑:我确实查看了DataOutputStream和DataInputStream,但我无法将字节转换为字符串而不是字节[],这意味着在转换为写入套接字时可能会丢失信息

  • 帕夫

看看
数据输入流
数据输出流
对象输入流
对象输出流
。首先检查数据的布局是否为您所接受。此外,序列化。

套接字既不处理
char[]
也不处理
byte[]
,而是处理
InputStream
OutputStream
,它们用于读取和写入字节。

如果通过套接字发送数据,则根本不需要临时字节数组;您可以使用DataOutputStream或ObjectOutputStream包装套接字的OutputStream,然后只写您想写的内容


我可能忽略了一个方面,这意味着您确实需要临时字节数组。如果是,请查看ByteArrayOutputStream。当然,这里没有memcpy(),但有System.arraycopy。

如上所述,DataInputStream和DataOutputStream正是您要寻找的。如果你打算通过网络使用Java字符串,你不是在设计网络协议,而是在设计Java协议。如果您确定另一端是Java,或者您可以对另一端进行编码以理解这些格式,则有readUTF()和writeUTF()。或者,您可以将相应的字符集与字节一起发送,或者在有意义的情况下为整个协议预定义字符集。

套接字是输入流和输出流,您需要将DIS/DOS分层。此外,对于字符串和字节[]之间的转换,您需要在
new String()
String#getBytes()
中指定字符集,或者使用读写器。