2014-12-15 19 views
5

Java'da, byte[] nolu diğer byte[]'u nasıl kopyalayamadan özel konumdan nasıl alabilirim?byte [], başka bir byte [] özel konumundan kopyalamaksızın nasıl alınır?

Örnek:

byte[] bytes1 = new byte[100]; 
for (int i = 0; i < 100; i++) { 
    bytes1[i] = (byte)(i+1); 
} 
byte[] byte2; 

nasıl pozisyon 10'da byte1 için byte2 işaret edebilir? byte2'un bunu istiyorum: [0] = 10, [1] = 11, [2] = 12

Mümkün mü?

ByteBuffer ile denedim, ancak hiç bir başarıda bulunmadan.

+1

Maalesef yapamazsınız. Belki bir seçenek: http: //fastutil.di.unimi.it/docs/it/unimi/dsi/fastutil/bytes/ByteList.html # subList (int, int)? –

+0

@LyubomyrShaydariv bu yardımcı program bir "Liste " ile desteklenmektedir, cevabımı bakın. –

+0

@StefanoSanfilippo bir "Liste " tarafından desteklenmiyor - http://grepcode.com/file/repo1.maven.org/maven2/it.unimi.dsi/fastutil/6.5.1/it/unimi/dsi/ fastutil/bytes/ByteArrayList.java - dahili byte [] a', 'Byte [] a' değil. Fastutil verimli ilkel koleksiyonlar ve haritalar için tasarlanmıştır. –

cevap

0

Üzgünüm, yapamazsınız.

Java'da her dizi bir nesnedir. Elemanları depolamanın yanı sıra dizinin uzunluğunu da depolar.

4

VM iç elemanlar vidalama kısa tek şey Arrays.asList(bytes1).subList(startIndex, endIndex) benzer şekilde kullanıyor (asList() çalışmıyor unutmayın (evet, o için ileri-geri JNI'yı çağırır ile örn işaretçi aritmetik yapmak mümkün olan) İlkel dizileri kendi başına yazmanız ya da 'net için benzer bir uygulama' yazmanız gerekir '(http://fastutil.di.unimi.it/docs/it/unimi/dsi/fastutil/bytes/ByteList.html#subList%28int burada akla gelir) - görünümü bu şekilde değil, byte[] değil Java'da temelde imkansız olmak (VM hackleri hariç olmak üzere). ; Özellikle java.nio.Buffer, ByteBuffer kullanmak belleğe pointer Java muadili olduğunu beri - demiştin

Alternatif

yapın Dizi destekli ByteBuffer ile temel olarak ya doğrudan dizgeye erişebilir, ya da ya arabelleğe/modifiye (örneğin, ofset ile) yoluna erişebilirsiniz.

ByteBuffer bytes1 = ByteBuffer.allocate(100); 
for (int i = 0; i < 100; i++) { 
    bytes1.put((byte)(i+1)); 
} 
bytes1.position(offset); 
ByteBuffer byte2 = bytes1.slice(); 

hatta

byte[] bytes1 = new byte[100]; 
for (int i = 0; i < 100; i++) { 
    bytes1[i] = (byte)(i+1); 
} 
ByteBuffer bytes1 = ByteBuffer.wrap(bytes1); 
bytes1.position(offset); 
ByteBuffer byte2 = bytes1.slice(); 
+3

'Arrays.asList (bytes1)' - byte [] bytes1' için beklendiği gibi çalışmayacaktı. –

+0

@AlexeyShestakov true, IFTFY – vaxquis

+0

bayt [] bayt = yeni bayt [100]; (int i = 0; i <100; i ++) { bayt [i] = (bayt) (i + 1); } ByteBuffer bf1 = ByteBuffer.wrap (bayt); bf1.pozisyon (15); ByteBuffer bf2 = bf1.slice(); byte [] byes2 = bf2.array(); ama byte2 15, 16, 17 içermiyor. 1, 2, 3 ... içermiyor, bu yüzden ByteBuffer – user3668129

3

Maalesef bunu yapamazsınız. Esas olarak C/C++ işaretçi aritmetiği soruyorsunuz ve Java'da böyle bir şey yok. Ancak, farklı bir arabirim kullanmaya istekli iseniz, Commons Primitives ArrayByteList ile şansınız olabilir. byte s gerçek bir diziyle desteklendiği için basit bir List<Byte> değil - dolayısıyla Byte nesnelerinin kullanılması nedeniyle bellek yükü kalmaz. Hala bazı nesnelere sahip olacaksınız, ama bu pratik durumlarda kabul edilebilir.

En önemlisi, yöntemi aracılığıyla kopyasını kopyasını oluşturmayan dilimleri destekler. source code'u kontrol edebilirsiniz, dilim orijinal diziye referans olarak ve başlangıç ​​ve bitiş konumları için iki işaretçi olarak uygulanır. Ancak, kopyadan kaçınmanın, dilimdeki değişikliklerin orijinal diziye yansıtılacağı anlamına geldiğini unutmayın. Muhtemelen istediğin bu, ama yine de çok dikkatli ol - özellikle C/C++ arka planından gelmiyorsan, bu şeylerin ortak bir uygulama olduğu yerde.