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.