2012-06-26 37 views
93

Tôi phải lưu trữ một số giá trị không đổi (UUID) ở dạng mảng byte trong java, và tôi tự hỏi cách tốt nhất để khởi tạo các mảng tĩnh đó là gì. Đây là cách tôi hiện đang làm nó, nhưng tôi cảm thấy như phải có một cách tốt hơn.Làm cách nào để khởi tạo một mảng byte trong Java?

private static final byte[] CDRIVES = new byte[] { (byte)0xe0, 0x4f, (byte)0xd0, 
    0x20, (byte)0xea, 0x3a, 0x69, 0x10, (byte)0xa2, (byte)0xd8, 0x08, 0x00, 0x2b, 
    0x30, 0x30, (byte)0x9d }; 
private static final byte[] CMYDOCS = new byte[] { (byte)0xba, (byte)0x8a, 0x0d, 
    0x45, 0x25, (byte)0xad, (byte)0xd0, 0x11, (byte)0x98, (byte)0xa8, 0x08, 0x00, 
    0x36, 0x1b, 0x11, 0x03 }; 
private static final byte[] IEFRAME = new byte[] { (byte)0x80, 0x53, 0x1c, 
    (byte)0x87, (byte)0xa0, 0x42, 0x69, 0x10, (byte)0xa2, (byte)0xea, 0x08, 
    0x00, 0x2b, 0x30, 0x30, (byte)0x9d }; 
... 
and so on 

Có bất kỳ điều gì tôi có thể sử dụng có thể kém hiệu quả hơn nhưng sẽ trông sạch hơn? ví dụ:

private static final byte[] CDRIVES = 
    new byte[] { "0xe04fd020ea3a6910a2d808002b30309d" }; 

Trả lời

87

Sử dụng một chức năng chuyển đổi một chuỗi hexa để byte[], bạn có thể làm

byte[] CDRIVES = hexStringToByteArray("e04fd020ea3a6910a2d808002b30309d"); 

tôi muốn đề nghị bạn sử dụng chức năng xác định bởi Dave L trong Convert a string representation of a hex dump to a byte array using Java?

tôi chèn nó ở đây để có thể đọc tối đa:

public static byte[] hexStringToByteArray(String s) { 
    int len = s.length(); 
    byte[] data = new byte[len/2]; 
    for (int i = 0; i < len; i += 2) { 
     data[i/2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) 
          + Character.digit(s.charAt(i+1), 16)); 
    } 
    return data; 
} 

Nếu bạn để CDRIVES staticfinal, sự sụt giảm hiệu suất là Irrel evant.

6

Bạn có thể sử dụng lớp UUID Java để lưu trữ các giá trị, thay vì mảng byte:

UUID 

public UUID(long mostSigBits, 
      long leastSigBits) 

xây dựng một UUID mới bằng cách sử dụng dữ liệu theo quy định. mostSigBits được sử dụng cho 64 bit quan trọng nhất của UUID và minimumSigBits trở thành 64 bit quan trọng nhất của UUID.

1

Theo như một quá trình sạch là có liên quan, bạn có thể sử dụng ByteArrayOutputStream đối tượng ...

ByteArrayOutputStream bObj = new ByteArrayOutputStream(); 
bObj.reset(); 

// viết tất cả các giá trị để bObj từng người một bằng

bObj.write(byte value) 

// khi hoàn tất, bạn có thể lấy byte [] bằng cách sử dụng

CDRIVES = bObj.toByteArray(); 

// bạn cũng có thể lặp lại quy trình tương tự cho CMYDOCS và IEFRAME,

LƯU Ý Đây không phải là giải pháp hiệu quả nếu bạn thực sự có mảng nhỏ.

27

Trong Java 6, có một phương pháp làm chính xác những gì bạn muốn:

private static final byte[] CDRIVES = javax.xml.bind.DatatypeConverter.parseHexBinary("e04fd020ea3a6910a2d808002b30309d") 

Hoặc bạn có thể sử dụng Google Guava:

import com.google.common.io.BaseEncoding; 
private static final byte[] CDRIVES = BaseEncoding.base16().lowerCase().decode("E04FD020ea3a6910a2d808002b30309d".toLowerCase()); 

Phương pháp Ổi là quá mức cần thiết, khi bạn đang sử dụng mảng nhỏ . Nhưng Guava cũng có các phiên bản có thể phân tích cú pháp luồng đầu vào. Đây là một tính năng tuyệt vời khi xử lý các đầu vào hệ thập lục phân lớn.

+0

Ví dụ Ổi làm việc không hoàn toàn như bằng văn bản - nó cần phải được 'base16() thành chữ thường (.) .decode (...) 'nếu bạn có chữ số hex chữ thường thấp hơn. http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/io/BaseEncoding.html#lowerCase() –

+0

@PeterDeGlopper Phát hiện tốt, tôi đã cập nhật câu trả lời để mã hiện đang xử lý các chuỗi có cả ký tự chữ thường và chữ thường. –

42
byte[] myvar = "Any String you want".getBytes(); 
+38

Không phải là biến chuỗi "0000" 'thành' {0x30,0x30,0x30,0x30} '(ASCII) thay vì' {0x00,0x00,0x00,0x00} '(nhị phân) như mong muốn của áp phích? – jww

+6

Bạn không trả lời đúng câu hỏi. –

+1

Và điều này thu hút 52 upvotes ?! Oi vey. –

-5
byte[] responseBody = "Invalid Domain Alias".getBytes(); 
1

lựa chọn ưa thích của tôi trong trường hợp này là sử dụng org.apache.commons.codec.binary.Hex trong đó có các API hữu ích để chuyển đổi giữa String y hex và nhị phân. Ví dụ:

  1. Hex.decodeHex(char[] data) đó ném một DecoderException nếu có các ký tự không hex trong mảng, hoặc nếu có một số lẻ của các nhân vật.

  2. Hex.encodeHex(byte[] data) là đối tác của phương thức giải mã ở trên và phun ra char[].

  3. Hex.encodeHexString(byte[] data) chuyển đổi từ mảng byte thành String.

Cách sử dụng: Hex.decodeHex("dd645a2564cbe648c8336d2be5eafaa6".toCharArray())

-2
private static final int[] CDRIVES = new int[] {0xe0, 0xf4, ...}; 

và sau khi truy cập chuyển đổi sang byte.

0

Một giải pháp không có thư viện, chiều dài năng động trở lại, unsigned integer giải thích (không bổ sung hai nhân)

public static byte[] numToBytes(int num){ 
    if(num == 0){ 
     return new byte[]{}; 
    }else if(num < 256){ 
     return new byte[]{ (byte)(num) }; 
    }else if(num < 65536){ 
     return new byte[]{ (byte)(num >>> 8),(byte)num }; 
    }else if(num < 16777216){ 
     return new byte[]{ (byte)(num >>> 16),(byte)(num >>> 8),(byte)num }; 
    }else{ // up to 2,147,483,647 
     return new byte[]{ (byte)(num >>> 24),(byte)(num >>> 16),(byte)(num >>> 8),(byte)num }; 
    } 
} 
Các vấn đề liên quan