【问题标题】:How can I access a byte array as shorts in Java如何在 Java 中将字节数组作为短裤访问
【发布时间】:2011-01-30 14:22:59
【问题描述】:

我有一个字节数组,大小为 n,它真正表示一个大小为 n/2 的数组。在我将数组写入磁盘文件之前,我需要通过添加存储在另一个短数组中的偏差值来调整值。在 C++ 中,我只需将字节数组的地址分配给具有强制转换为 short 的短数组的指针,并使用指针算术或使用联合。

这如何在 Java 中完成 - 我对 Java BTW 很陌生。

【问题讨论】:

    标签: java bytearray short


    【解决方案1】:

    您可以自己做一些小游戏,但我建议您看看 ByteBufferShortBuffer 类。

    byte[] arr = ...
    ByteBuffer bb = ByteBuffer.wrap(arr); // Wrapper around underlying byte[].
    ShortBuffer sb = bb.asShortBuffer(); // Wrapper around ByteBuffer.
    
    // Now traverse ShortBuffer to obtain each short.
    short s1 = sb.get();
    short s2 = sb.get(); // etc.
    

    【讨论】:

    【解决方案2】:

    你可以用 java.nio.ByteBuffer 包装你的字节数组。

    byte[] bytes = ...
    ByteBuffer buffer = ByteBuffer.wrap( bytes );
    
    // you may or may not need to do this
    //buffer.order( ByteOrder.BIG/LITTLE_ENDIAN );
    
    ShortBuffer shorts = buffer.asShortBuffer( );
    
    for ( int i = 0, n=shorts.remaining( ); i < n; ++i ) {
        final int index = shorts.position( ) + i;
    
        // Perform your transformation
        final short adjusted_val = shortAdjuster( shorts.get( index ) );
    
        // Put value at the same index
        shorts.put( index, adjusted_val );
    }
    
    // bytes now contains adjusted short values
    

    【讨论】:

      【解决方案3】:

      执行此操作的正确方法是使用班次。所以

      for (int i = 0; i < shorts.length; i++) {
          shorts[i] = (short)((bytes[2*i] << 8) | bytes[2*i + 1]);
      }
      

      此外,它在许多方面取决于流的字节顺序。这可能会更好

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-24
        • 1970-01-01
        • 1970-01-01
        • 2013-11-04
        • 2014-10-21
        • 2012-01-26
        相关资源
        最近更新 更多