我在java编码,我遇到了问题 我正在使用一个接口(老师给了我们,我们无法改变它),界面强制你实现一个输入字节数组的函数,通过这个数组,你可以传输你想要的任何数据。
我需要传递一些未知大小的不同对象,有没有办法做到这一点?我显然可以把每个对象的大小放在一开始,但这有什么比这更简单的方法了吗?
我还需要从另一种语言(如c或cpp)传递字节数组中的数据 所以该技术必须非特定于java
这是代码看起来像
的简单示例void myFunc(byte[] arr)
{
byte[] name; // arr[0:10] string in ascii
byte[] lastName; //arr[10:k] string in ascii
byte[] currentUnixTime; //arr[k:arr.lenfth] this is an int
some operations.....
}
答案 0 :(得分:0)
因此,如果没有进一步的细节,您可以通过序列化一般发送Object
,但它可能并不总是一个好主意。这是Object
序列化的一个相当通用的实现。
interface Sender {
void write(OutputStream outputStream, Object... objects);
List<Object> read(InputStream inputStream);
}
class Homework implements Sender {
@Override
public void write(OutputStream stream, Object... objects) {
for (Object obj : objects) {
try (ObjectOutputStream objStream = new ObjectOutputStream(stream)) {
objStream.writeObject(obj);
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public List<Object> read(InputStream stream) {
List<Object> objectList = new ArrayList<>();
try (ObjectInputStream objStream = new ObjectInputStream(stream)) {
Object obj;
while ((obj = objStream.readObject()) != null) {
objectList.add(obj);
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
return objectList;
}
}
编辑:我误解了这个问题。以下是使用byte[]
s 的实现
interface Sender {
byte[] write(Object... objects);
List<Object> read(byte[] bytes);
}
class Homework implements Sender {
@Override
public byte[] write(Object... objects) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
try (ObjectOutputStream objStream = new ObjectOutputStream(out)) {
for (Object obj : objects) {
objStream.writeObject(obj);
}
objStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
return out.toByteArray();
}
@Override
public List<Object> read(byte[] bytes) {
List<Object> objectList = new ArrayList<>();
ByteArrayInputStream byteInputStream = new ByteArrayInputStream(bytes);
try (ObjectInputStream objStream = new ObjectInputStream(byteInputStream)) {
Object obj;
while ((obj = objStream.readObject()) != null) {
objectList.add(obj);
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
return objectList;
}
}
然后使用它。
Homework homework = new Homework();
String helloWorld = "hello world";
byte[] helloBytes = homework.write(helloWorld);
assert homework.read(helloBytes).get(0).equals(helloWorld);
答案 1 :(得分:0)
最后我做了什么 - 我将每个要发送的对象转换为32,然后在每个转换对象之间添加一个','来分隔对象(因为','不需要基本32表示)。 之后分析很简单