【问题标题】:2D Array to int (seed) and back二维数组到 int(种子)并返回
【发布时间】:2016-06-25 17:12:22
【问题描述】:

我有一个问题......

这里我们得到一个二维字节数组:

byte[][] duengonMap = new byte[500][500];

因为我想将它从客户端发送到服务器或 反过来,我需要将它放入 int/long 中。它将从服务器发送到其他连接的客户端,然后它将转换回二维数组。听起来很简单……但是我该怎么做呢?

我试过类似的东西:

int[][] twoD = new int[][] { new int[] { 1, 2 },
        new int[] { 3, 4 } };

int[][] newTwoD = null; // will deserialize to this

System.out.println("Before serialization");
for (int[] arr : twoD) {
    for (int val : arr) {
        System.out.println(val);
    }
}

try {
    FileOutputStream fos = new FileOutputStream("test.dat");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(twoD);

    FileInputStream fis = new FileInputStream("test.dat");
    ObjectInputStream iis = new ObjectInputStream(fis);
    newTwoD = (int[][]) iis.readObject();

} catch (Exception e) {

}

System.out.println("After serialization");
for (int[] arr : newTwoD) {
    for (int val : arr) {
        System.out.println(val);
    }
}
}

它只是被转换成一个“文件”,也许我做错了, 但我不知道如何将其转换为 int 或 long ... 有任何想法吗 ?还是例子?

【问题讨论】:

  • 为什么您认为需要转换为 int? byte[][] 是一个对象;所以你可以简单地发送它;使用writeObject()。还是我在这里遗漏了什么?
  • 是的,因为我使用的是 Kryonet,没有提到这一点。而且你不能通过 udp 或 tcp 发送字节 [] [] 或大对象,而不是服务器将崩溃:/
  • 没有人解决?

标签: java arrays serialization libgdx server


【解决方案1】:

基本上有两个问题需要解决。

1) 如何将一个字节转换为一个整数,反之亦然……这很简单,在这里可能已经回答过无数次了。 见here fore example

2) 现在,您知道如何发送一个字节/整数...您唯一需要做的...就是定义您想要遍历数组的顺序。含义:你遍历你的字节数组,将每个字节作为 int 发送;另一方面,您读取 int 值,并使用相同的遍历算法填充字节数组。

当然,最简单的解决方案是嵌套 for 循环;但取决于您的数据;您可能会发现其他想法很有帮助。例如:如果您的字节数组包含许多 0 值...您可能决定只传输非 0 值(例如发送由索引+值组成的对)。

【讨论】:

  • 感谢您的快速回复 :) 我刚刚查看了示例...这仅适用于 1d 字节数组或 2d 吗?我还看到,它只在 int 中放入了一个值……但是如何将整个二维数组放入其中? O.o 只发送非 0 值是个好主意......刚刚尝试过但也不起作用,我的地图似乎很大:(
  • 抱歉,请阅读我的回答。您遍历您的数组,然后将单个字节作为 int 发送。你确定你发送的数据太多了吗?从您询问的方式来看,您的实现似乎更有可能损坏,因此它无法正常工作。从这个意义上说:打开一个新问题;发布您的代码;包括您遇到的错误的完整描述。换句话说:是什么让您认为您正在达到“数据量”限制?
  • 好的,现在我明白了,我试试看,为什么没有任何库呢? :) 不,我的实现没有被破坏,因为一切正常,只有我传输 byte[][] 的部分卡住了......我没有收到任何错误消息,服务器只是毫无例外地关闭
  • 只是为了确定:这意味着您对双方都进行了全面测试;并且您还确保其他客户端/服务器通信正常工作?我的意思是:我高度怀疑服务器崩溃意味着“数据过多”。相反,如果您的服务器在运行代码时崩溃,我认为您的代码已损坏。
  • 是的,不用担心多人服务器可以正常工作数周,它只会在我尝试发送我的字节 [] [] 或包含字节 [] [] 的对象时崩溃找到很多崩溃报告,但不是一个简单的解决方案......最结束的是:“使用种子”或将您的数组转换为 int(种子)并将其转换回来。不发送 byte[][] 它工作正常
【解决方案2】:

您可以使用循环逐一发送所有值,并在服务器/客户端上同时读取它们并将它们排列回数组中

【讨论】:

  • 感谢您的回答 :) 这可行,但如果您想分享您的地图怎么办?然后你需要一颗种子。此外,它会导致服务器和客户端之间的大量流量:/
猜你喜欢
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 2012-04-12
  • 2023-03-14
相关资源
最近更新 更多