【问题标题】:Java - is there something like binary stream?Java - 有没有像二进制流这样的东西?
【发布时间】:2013-07-07 06:40:00
【问题描述】:

我有一个问题。

是否有库等将 int 和字符串组合成字节数组?

喜欢:

byte temparray[] = new byte[10];

int a = 10;
int b = 10;

temparray << new String("12") << a << b;

谢谢。

编辑

    byte[] buffer = new byte[649];

    byte[] charname = this.getName().getBytes();
    System.arraycopy(charname, 0 , buffer, 0, charname.length);

    for(int i=0;i<16;i++) //mystery crs 16 zeros
    {
        buffer[i+17] = (byte)0x30;
    }

    buffer[34] = this.faction;

    if(this.characterClass == 2)
    {
        buffer[40] = 2;      
    } else
    {
        buffer[40] = 1; 
    }
    System.arraycopy(BitTools.shortToByteArray(face), 0, buffer, 42, 2);
    buffer[44] = 1; 
    buffer[48] = (byte)this.characterClass; //class byte
    buffer[52] = 2; explanation yet

    buffer[54] = (byte)this.getLevel();

这是我的数据包生成器的一个示例,我想对其进行简化,但在数据包中我只使用了 short、int 和 strings。

【问题讨论】:

  • String 有一个重载的getBytes(),它返回一个字节数组。
  • 您应该确切地考虑您想要的输出。您希望如何对字符串进行编码?您希望如何对整数进行编码?
  • 我想简化数据包创建的过程,但首先我需要手动转换为使用非最佳替换的字节。

标签: java arrays operators


【解决方案1】:

看看String#getBytesByteBuffer。根据您的用例,字符集和字节顺序可能很重要。

【讨论】:

    【解决方案2】:

    http://docs.oracle.com/javase/7/docs/api/

    Integer.byteValue();
    Double.byteValue();
    String.getBytes();
    // etc.
    

    【讨论】:

    • String.getBytes() 假定平台编码与任何一段代码的写入编码不一致。
    • 执行此操作将丢失任何大于 127 的整数的精度。正如 Java 文档所示,这些调用可能涉及截断。
    • @MikeSamuel 您始终可以使用重载方法,例如 String
    • 很公平。进行了更多挖掘并在 BigInteger.toByteArray() 中找到了一些更好的信息。 “返回一个字节数组,其中包含此 BigInteger 的二进制补码表示。字节数组将采用大端字节序:最高有效字节位于第零个元素中。数组将包含表示所需的最小字节数这个BigInteger,包括至少一个符号位,即(ceil((this.bitLength() + 1)/8))。(这种表示与(byte[])构造函数兼容。)"
    【解决方案3】:

    java.io.ByteArrayOutputStream 是一种流实现,它在内部字节数组上收集内容,您可以将其包装在 java.io.OutputStreamWriter 中以向其写入字符内容。

    ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
    Writer out = new OutputStreamWriter(byteOut, "UTF-8");  // Uses UTF-8 encoding
    out.write("12");
    out.write(10);
    out.write(10);
    out.close();
    
    byte[] bytes = byteOut.toByteArray();
    

    在此之后,bytes.length 的长度足以容纳写入byteOut 的字节。

    【讨论】:

    • 我可以指定字符串长度,如果小于 16 字节,它将以 0x00 归档?
    • @KacperFalat,没有。 java中没有snprintf等价物。缓冲区根据需要增长。如果你想 NUL 垫,你需要自己做。
    【解决方案4】:

    是的。见java.io.ByteArrayOutputStream。请注意,您可以包装此流以支持写入其他类型,例如 String:PrintWriter pw = new PrintWriter(yourByteArrayOutputStream); pw.print("Hello");

    然后使用yourByteArrayOutputStream.toByteArray(); 获取字节数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-30
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多