【问题标题】:How to get same result than Java .readUTF() in node.js?如何在 node.js 中获得与 Java .readUTF() 相同的结果?
【发布时间】:2020-07-04 03:18:07
【问题描述】:

我正在使用 node.js 在网页上制作游戏服务器信息部分,为了获取服务器信息,我使用 net.socket 向服务器发送信息请求并将它们发回。 游戏客户端是用java编写的,并像这样解析服务器发送的数据:

public static Object[] readParameters(DataInputStream paramDataInputStream) throws IOException {
        int i;
        Object[] arrayOfObject = new Object[i = paramDataInputStream.readInt()];
        
        for (byte b = 0; b < i; b++) {
          byte[] arrayOfByte; byte b1;
          switch (b1 = (byte)paramDataInputStream.read()) {
            case 2:
              arrayOfObject[b] = Long.valueOf(paramDataInputStream.readLong());
              break;
            case 4:
              arrayOfObject[b] = paramDataInputStream.readUTF();
              break;
            case 3:
              arrayOfObject[b] = Float.valueOf(paramDataInputStream.readFloat());
              break;
            case 1:
              arrayOfObject[b] = Integer.valueOf(paramDataInputStream.readInt());
              break;
            case 5:
              arrayOfObject[b] = Boolean.valueOf(paramDataInputStream.readBoolean());
              break;
            case 6:
              arrayOfObject[b] = Byte.valueOf(paramDataInputStream.readByte());
              break;
            case 7:
              arrayOfObject[b] = Short.valueOf(paramDataInputStream.readShort());
              break;
            
            case 8:
              arrayOfByte = new byte[paramDataInputStream.readInt()];
              paramDataInputStream.readFully(arrayOfByte);
              arrayOfObject[b] = arrayOfByte;
              break;
            default:
              throw new IllegalArgumentException("Type: " + arrayOfByte + " unknown. parameter " + b + " of " + i);
          } 
        
        } 
        return arrayOfObject;
    }

网页是使用 node.js 和 express 托管的,我调整了解析功能:

//data is a buffer
function readParameter(data){
    var indexI = 0;
    function sRead(buffer){
        var tempVar = buffer.readUInt8(indexI);
        indexI += 1;
        return tempVar;
    }
    function sReadByte(buffer){
        var tempVar = buffer.readInt8(indexI);
        indexI += 1;
        return tempVar;
    }
    function sReadShort(buffer){
        var tempVar = buffer.readInt16BE(indexI);
        indexI += 2;
        return tempVar;
    }
    function sReadInt(buffer){
        var tempVar = buffer.readInt32BE(indexI);
        indexI += 4;
        return tempVar;
    }
    function sReadFloat(buffer){
        var tempVar = buffer.readFloatBE(indexI);
        indexI += 4;
        return tempVar;
    }
    function sReadLong(buffer){
        var tempVar = buffer.readBigInt64BE(indexI);
        indexI += 8;
        return tempVar;
    }
    function sReadBoolean(){
        var tempA = buffer.readUInt8(indexI);
        indexI += 1;
        if(tempA==0){
            return false;
        }else{
            return true;
        }
    }
    function sReadFully(buffer){
        var tempA = buffer.slice(indexI);
        indexI = tempA.length;
        return tempA;
    }
    
    var i = sReadInt(data);
    var arrayOfObject = [];
    for(var b = 0; b < i; b++){
        var arrayOfByte = [];
        var b1 = sRead(data);
        switch(b1){
            case 1:
                arrayOfObject[b] = sReadInt(data);
                break;
            case 2:
                arrayOfObject[b] = sReadLong(data);
                break;
            case 3:
                arrayOfObject[b] = sReadFloat(data);
                break;
            case 4:
                //Don't know how to handle it, want result similar to DataInputStream.readUTF() from java
                break;
            case 5:
                arrayOfObject[b] = sReadBoolean(data);
                break;
            case 6:
                arrayOfObject[b] = sReadByte(data);
                break;
            case 7:
                arrayOfObject[b] = sReadShort(data);
                break;
            case 8:
                sReadInt(data);
                arrayOfByte = sReadFully(data);
                arrayOfObject[b] = arrayOfByte;
                break;
            default:
                console.log("Type :" + arrayOfByte + "unknown. parameter " + b + " of " + i);
                break;
        }
    }
    return arrayOfObject;
}

但我不知道如何在 node.js 中的“案例 4:”中从 java 中获得与 readUTF() 相同的结果。

我该怎么做?

提前感谢您的帮助!

【问题讨论】:

标签: javascript java node.js


【解决方案1】:

DataInput.readUTF 在https://docs.oracle.com/javase/7/docs/api/java/io/DataInput.html#readUTF() 中完全指定:

它有两个部分。第一部分是一个 16 位长度的字段,它告诉您第二部分中的字节数。第二部分是一个字节字符串,它使用类似于 UTF-8 的方案对文本进行编码。

您可以轻松读取字节:

        case 4:
            var length = sReadShort(data);
            // Read 'length' bytes
            var bytes = buffer.slice(indexI, indexI+length)
            indexI=indexI+length
            break;

完全复制 readUTF 使用的非标准文本编码并非易事。

【讨论】:

  • 哦,谢谢,当我在寻找 readUTF 的文档时,我只找到了一个简短的描述 readUTF() 做什么但不知道它是如何做的。
猜你喜欢
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 2021-07-17
  • 1970-01-01
相关资源
最近更新 更多