Short []到byte []不按顺序提供原始数据

时间:2017-04-17 18:54:37

标签: java type-conversion

我有一个short[],其中包含tiff图像的像素数据。我想使用以下代码将其转换为byte[]。从技术上讲,以下代码进行转换。但是,当我将结果字节写入原始文件并将它们与图像的原始字节进行比较时(在通过我的程序运行之前),一些字节会被切换。它几乎看起来像字节的字节序切换,但它不会发生在每个字节块上。我尝试使用StackOverflow和其他论坛上的代码I中的不同转换方法,但我始终得到相同的结果。 Java是如何处理导致此问题的字节的?

代码:

public static byte[] convert(short[] bytesAsShort) {
    int j = 0;
    int length = bytesAsShort.length;
    byte[] byteData = new byte[length * 2];
    for (int i = 0; i < length; i++) {
        byteData[j++] = (byte) (bytesAsShort[i] >>> 8);
        byteData[j++] = (byte) (bytesAsShort[i] >>> 0);
    }
    return byteData;
}

感谢任何帮助。如果我能做些什么可以让我的问题更清楚,请告诉我。谢谢!

更新 一些样本字节为十六进制值(包含更多样本大小),之前:

 FF 00 01 01 A0 00 A5 00 A0 00 A3 00 8F 00 AB 00 D4 00 08 01

后:

 FF 01 01 00 A0 00 A5 00 A0 00 A3 00 8F 00 AB 00 D4 01 08 00

是的,看起来肯定会改变字节顺序。要快点测试一下。

更新2 :我尝试转换的其他功能:

public static byte[] convert(short[] bytesAsShort) {
    int index;
    int iterations = bytesAsShort.length;

    ByteBuffer bb = ByteBuffer.allocate(bytesAsShort.length * 2);

    for (index = 0; index != iterations; ++index) {
        bb.putShort(bytesAsShort[index]);
    }

    return bb.array();
}

1 个答案:

答案 0 :(得分:0)

以下单元测试表明问题中列出的转换函数也正确地转换了问题中的样本数据。

因此,您遇到的问题在其他地方,目前未在问题中列出。问题在于加载数据或写入数据(可能两者)。我建议您编写一个知道起始数据的单元测试,并断言磁盘上显示的输出数据。这将帮助您找出问题所在。如果没有,请发布完整的单元测试,我们会进一步帮助您。

// unmodified convert method
public static byte[] convert(short[] bytesAsShort) {
    int j = 0;
    int length = bytesAsShort.length;
    byte[] byteData = new byte[length * 2];
    for (int i = 0; i < length; i++) {
        byteData[j++] = (byte) (bytesAsShort[i] >>> 8);
        byteData[j++] = (byte) bytesAsShort[i];
    }
    return byteData;
}


@Test
public void testConversion() {
    short[] orig= new short[] {(short) 0xFF00, (short) 0x0101, (short) 0xA000, (short) 0xA500,
        (short) 0xA000, (short) 0xA300, (short) 0x8F00, (short) 0xAB00, (short) 0xD400, (short) 0x0801};

    // same bytes as orig, but broken up into 8 bits rather than 16
    byte[] expected= new byte[] {(byte) 0xFF, 0x00, 0x01, 0x01, (byte)0xA0, 0x00, (byte)0xA5,
        0x00, (byte)0xA0, 0x00, (byte)0xA3,
        0x00, (byte)0x8F, 0x00, (byte)0xAB, 0x00, (byte)0xD4, 0x00, 0x08, 0x01};

    byte[] result = convert( orig );

    assertBytesEqual( expected, result );
}

private void assertBytesEqual( byte[] expected, byte[] actual ) {
    assertEquals( expected.length, actual.length );

    for ( int i=0; i<expected.length; i++ ) {
        assertEquals( i+": "+expected[i] + " != " + actual[i], expected[i], actual[i] );
    }
}