Bayt dizisine Java tamsayısı


Yanıtlar:


294

Java NIO'nun ByteBuffer'ını kullanmak çok basittir:

byte[] bytes = ByteBuffer.allocate(4).putInt(1695609641).array();

for (byte b : bytes) {
   System.out.format("0x%x ", b);
}

çıktı:

0x65 0x10 0xf3 0x29 

4
Veya "0x%02X"her zaman iki onaltılık karakterin yanı sıra büyük harf onaltılıklar (ör. System.out.format("0x%02X", (byte) 10)Ekranlar) istiyorsanız biçimi kullanın 0x0A.
— Maarten Bodewes

12
Long gibi diğer türler için iyi çalışan bir desen olan 4'ün kodlanmasını önlemek için Integer.SIZE / 8 kullanabilirsiniz.
— davenpcj

3
@davenpcj Hatta Integer.SIZE / Byte.SIZE kullanabilirsiniz
— rkosegi

11
@rkosegi Veya Java 8'den beri Integer.BYTES :)
— drvdijk

1
@MaartenBodewes iş parçacığının görünür biçimlendirme için bir şey yok, ancak yerel tür işlem
— Jacek Cz

147

Nasıl olur:

public static final byte[] intToByteArray(int value) {
    return new byte[] {
            (byte)(value >>> 24),
            (byte)(value >>> 16),
            (byte)(value >>> 8),
            (byte)value};
}

Fikir benim değil . Bunu dzone.com'daki bazı yayınlardan aldım .


44
Ne demek istediğini anlıyorum, ama bu özel görev için 'benim' kodum bazı 'sihirli' ByteBuffer'dan daha açıklayıcı ve net, ki ne yaptığını görmek zorunda.
— Grzegorz Oledzki

24
@Kevin - bu çok sert - bu tür kodların uygun olduğu birçok örnek var, örneğin görüntü işlemede. JDK kütüphaneleri genel olarak mükemmeldir, ancak tüm kullanım durumlarını kapsamaz ve / veya optimize edilmezler.
— mikera

14
kabul; ByteBuffer'ın genel giderleri ve karmaşıklığı, bazı basit ve iyi bilinen bayt işlemlerine kıyasla uygun olmayabilir.
— swdunlop

6
Ekleyeceğim diğer bir nokta da >>>, sağ kaydırma operatörü >>( docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html ) yerine imzasız sağ vardiya operatörünü kullanmanızdır, bu nedenle davranış istediğiniz gibi olmayabilir / imzalı veya imzasız sayılarla beklendiği gibi
— RobV

4
Bu yaklaşım, belirtilen ByteBuffer veya BigInteger yöntemlerinden biraz daha hızlı görünüyor. Çok fazla dönüşüm yapacaksanız dikkate almanız gereken başka bir şey.
— Arayan

45

BigInteger.valueOf(1695609641).toByteArray()


2
4 baytlık bir dizi üretecek garantiniz nedir?
— MeBigFatGuy

2
Tam olarak MeBigFatGuy ne yazdı. Javadoc of BigInteger.toByteArray()states: "Dizi, bu BigInteger'ı temsil etmek için gereken minimum bayt sayısını içerecektir ..."
— icza

2
Sorunun neresinde bayt dizisinin sabit uzunlukta 4 olmasını ister? Algoritmaya bağlı olarak, bu dizinin uzunluğunu kullanabilirsiniz
— vmpn

bu çok daha dinamik ve doğru cevap olmalı. İsterseniz istediğiniz boyutu oluşturmak için bir Array eki yapabilirsiniz. Özellikle Java imzalı int değerlerini göz önünde bulundurmanız gerektiğinde.
— Droid Chris

2
Bu 0x7f için bir bayt ve 0x80 için iki bayt oluşturuyor gibi görünüyor (iki bayt: 0x0 0x80).
— Scot

26
byte[] IntToByteArray( int data ) {    
    byte[] result = new byte[4];
    result[0] = (byte) ((data & 0xFF000000) >> 24);
    result[1] = (byte) ((data & 0x00FF0000) >> 16);
    result[2] = (byte) ((data & 0x0000FF00) >> 8);
    result[3] = (byte) ((data & 0x000000FF) >> 0);
    return result;        
}


7
byte[] conv = new byte[4];
conv[3] = (byte) input & 0xff;
input >>= 8;
conv[2] = (byte) input & 0xff;
input >>= 8;
conv[1] = (byte) input & 0xff;
input >>= 8;
conv[0] = (byte) input;

2
Bu, en az önemli 8 baytı ayıklar. Ayrıca, giriş numarasının işaretini dönüştürülmüş sekizlinin içine sürüklemeyi de önler.
— Carl Smotricz

stackoverflow.com/questions/35305634/… - bu C # 'ı Java'ya çözebilir misiniz?

5
public static byte[] intToBytes(int x) throws IOException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    DataOutputStream out = new DataOutputStream(bos);
    out.writeInt(x);
    out.close();
    byte[] int_bytes = bos.toByteArray();
    bos.close();
    return int_bytes;
}

4

Aşağıdaki parçalar en azından UDP üzerinden int göndermek için çalışır.

int - bayt dizisi:

public byte[] intToBytes(int my_int) throws IOException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutput out = new ObjectOutputStream(bos);
    out.writeInt(my_int);
    out.close();
    byte[] int_bytes = bos.toByteArray();
    bos.close();
    return int_bytes;
}

int için bayt dizisi:

public int bytesToInt(byte[] int_bytes) throws IOException {
    ByteArrayInputStream bis = new ByteArrayInputStream(int_bytes);
    ObjectInputStream ois = new ObjectInputStream(bis);
    int my_int = ois.readInt();
    ois.close();
    return my_int;
}

4
ObjectOutputStream kullanımı yanlış. DataOutputStream kullanın, OOS kullanımı bayt dizisi 4 bayt olmayacak şekilde yapar.
— 04:46

2

Genel olarak bu diziyi daha sonra int'e dönüştürmek isteyeceğiniz için, bir ints dizisini bir bayt dizisine dönüştürmenin yöntemleri veya tam tersi:

public static byte[] convertToByteArray(final int[] pIntArray)
{
    final byte[] array = new byte[pIntArray.length * 4];
    for (int j = 0; j < pIntArray.length; j++)
    {
        final int c = pIntArray[j];
        array[j * 4] = (byte)((c & 0xFF000000) >> 24);
        array[j * 4 + 1] = (byte)((c & 0xFF0000) >> 16);
        array[j * 4 + 2] = (byte)((c & 0xFF00) >> 8);
        array[j * 4 + 3] = (byte)(c & 0xFF);
    }
    return array;
}

public static int[] convertToIntArray(final byte[] pByteArray)
{
    final int[] array = new int[pByteArray.length / 4];
    for (int i = 0; i < array.length; i++)
        array[i] = (((int)(pByteArray[i * 4]) << 24) & 0xFF000000) |
                (((int)(pByteArray[i * 4 + 1]) << 16) & 0xFF0000) |
                (((int)(pByteArray[i * 4 + 2]) << 8) & 0xFF00) |
                ((int)(pByteArray[i * 4 + 3]) & 0xFF);
    return array;
}

İşaret yayılımı vb. Nedeniyle, int'ye dönüştürürken "& 0xFF ..." gerektiğini unutmayın.


1
integer & 0xFF

ilk bayt için

(integer >> 8) & 0xFF

ikinci ve döngü vb. için, önceden yerleştirilmiş bir bayt dizisine yazma. Ne yazık ki biraz dağınık.


1

Org.apache.hadoop.hbase.util.Bytes sınıfı, kullanışlı bayt [] dönüştürme yöntemlerine sahiptir, ancak HBase kavanozunun tamamını bu amaç için projenize eklemek istemeyebilirsiniz. Sadece böyle bir yöntemin JDK'dan AFAIK'i değil, aynı zamanda ortaklar gibi bariz kütüphanelerden de eksik olması şaşırtıcıdır.


1

Benim denemem:

public static byte[] toBytes(final int intVal, final int... intArray) {
    if (intArray == null || (intArray.length == 0)) {
        return ByteBuffer.allocate(4).putInt(intVal).array();
    } else {
        final ByteBuffer bb = ByteBuffer.allocate(4 + (intArray.length * 4)).putInt(intVal);
        for (final int val : intArray) {
            bb.putInt(val);
        }
        return bb.array();
    }
}

Bununla beraber bunu yapabilirsiniz:

byte[] fourBytes = toBytes(0x01020304);
byte[] eightBytes = toBytes(0x01020304, 0x05060708);

Tam sınıf burada: https://gist.github.com/superbob/6548493 , şort veya uzuntan başlatmayı destekler

byte[] eightBytesAgain = toBytes(0x0102030405060708L);

1

Apache-commons kullanıyorsanız

public static byte[] toByteArray(int value) {
    byte result[] = new byte[4];
    return Conversion.intToByteArray(value, 0, result, 0, 4);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.