有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java数组从长数组中获取特定字节

所以我有一个方法,它接受一个整数n,和两个长xy。它应该从x返回第一个n字节,从y返回其余字节。看起来很简单,但我对直接使用字节还不熟悉,所以无法使用此方法

public static long nBytesFromXRestY(int n, long x, long y) {
    int yl = longToBytes(y).length;
    byte[] xx = new byte[yl];
    byte[] xa = longToBytes(x);
    byte[] yb = longToBytes(y);
    for (int i=0;i<xx.length;i++) {
        if (i < n) {
            System.out.println("i < n");
            xx[i] = xa[i];
        } else {
            xx[i] = yb[i];
        }
    }
    System.out.println(Arrays.toString(xx));
    return bytesToLong(xx);
}

如果我为n = 3x = 45602345y = 10299207提供该方法,它应该返回45699207(对吧?)但它将返回10299207

它打印"i < n"三次,这样我就知道for和if/else正在工作。但是出于某种原因,它仍然只返回yb数组。对不起,如果这是一个愚蠢的问题。。对我来说是个新概念

编辑:longToBytesbytesToLong方法:

public static long bytesToLong(byte[] bytes) {
    ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);  
    buffer.put(bytes, 0, bytes.length);
    buffer.flip();//need flip 
    return buffer.getLong();
}

public static byte[] longToBytes(long x) {
    ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
    buffer.putLong(0, x);
    return buffer.array();
}

共 (1) 个答案

  1. # 1 楼答案

    可以使用位移动而不是创建对象

    public static long nBytesFromXRestY(int n, long x, long y) {
        long mask = ~0L << (n * 8);
        return (x & mask) | ( y & ~mask);
    }
    

    这将返回y的最低n*8位和x的较高位

    http://ideone.com/1CkqYT

    按预期打印

    45299207