2014-12-15 4 views
5

जावा में, मुझे आश्चर्य है कि मैं byte[] अन्य byte[] की विशिष्ट स्थिति से इसे कॉपी किए बिना कैसे प्राप्त कर सकता हूं?बाइट [] को अन्य बाइट की विशिष्ट स्थिति से कैसे प्राप्त करें [] प्रतिलिपि के बिना?

उदाहरण:

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

मैं कैसे स्थिति 10 पर byte1 को byte2 इंगित कर सकते हैं? मुझे लगता है कि byte2 होगा: [0] = 10, [1] = 11, [2] = 12

क्या यह संभव है?

मैंने बाइटबफर के साथ प्रयास किया लेकिन बिना किसी सफलता के।

+1

दुर्भाग्य से, आप नहीं कर सकते। शायद यह एक विकल्प है: http: //fastutil.di.unimi।यह/दस्तावेज़/यह/unimi/dsi/fastutil/बाइट्स/ByteList.html # उपसूची (int, int)? –

+0

@LyubomyrShaydariv कि उपयोगिता को 'सूची ' द्वारा समर्थित किया गया है, मेरा उत्तर देखें। –

+0

@StefanoSanfilippo इसे 'सूची ' द्वारा समर्थित नहीं है - http://grepcode.com/file/repo1.maven.org/maven2/it.unimi.dsi/fastutil/6.5.1/it/unimi/dsi/ fastutil/बाइट्स/ByteArrayList.java - इसमें आंतरिक 'बाइट [] ए' है,' बाइट [] ए' नहीं। फास्टुटिल कुशल आदिम संग्रह और मानचित्र के लिए डिज़ाइन किया गया है। –

उत्तर

0

मुझे खेद है, आप नहीं कर सकते।

जावा में प्रत्येक सरणी एक वस्तु है। तत्वों को संग्रहित करने के अलावा, यह सरणी की लंबाई भी संग्रहीत करता है।

4

वीएम internals के साथ पंगा लेना की कमी केवल एक चीज Arrays.asList(bytes1).subList(startIndex, endIndex) को समान तरीके से उपयोग कर रहा है (ध्यान दें कि asList() काम नहीं करता है (हाँ, यह जैसे के साथ सूचक अंकगणित करना संभव करने के लिए यहाँ से वहाँ JNI कहता है) अपने आप से आदिम सरणी के साथ, आपको 'प्राइमेटिव्स के लिए समान समान कार्यान्वयन' लिखना होगा या ढूंढना होगा; http://fastutil.di.unimi.it/docs/it/unimi/dsi/fastutil/bytes/ByteList.html#subList%28int यहां दिमाग में आता है) - ध्यान दें कि आपको List इस तरह से देखें, byte[] नहीं, क्योंकि इससे जावा में अनिवार्य रूप से असंभव हो (वीएम हैक्स के अपवाद के साथ, मुझे याद रखें)।

वैकल्पिक रूप से, आप क्या कहा - विशेष रूप से java.nio.Buffer, ByteBuffer उपयोग करते हैं, के बाद से स्मृति सूचक के जावा समकक्ष है कि; सरणी समर्थित ByteBuffer के साथ आप अनिवार्य रूप से या तो सीधे या सरणी/संशोधित (उदा। ऑफसेट के साथ) बफर तक पहुंच सकते हैं।

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

या यहाँ तक कि

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 (बाइट्स 1)' - जो 'बाइट [] बाइट्स 1' के लिए अपेक्षित काम नहीं करेगा। –

+0

@AlexeyShestakov सच, IFTFY – vaxquis

+0

बाइट [] बाइट्स = नया बाइट [100]; (int i = 0; i <100; i ++) { बाइट्स [i] = (बाइट) (i + 1); } बाइटबफर बीएफ 1 = बाइटबफर.वाप (बाइट्स); बीएफ 1.position (15); बाइटबफर बीएफ 2 = बीएफ 1.slice(); बाइट [] byes2 = bf2.array(); लेकिन बाइट 2 में 15, 16, 17 शामिल नहीं है। इसमें 1, 2, 3 शामिल है ... इसलिए बाइटबफर – user3668129

3

दुर्भाग्य से, आप नहीं कर सकते। जो आप अनिवार्य रूप से पूछ रहे हैं वह सी/सी ++ पॉइंटर अंकगणितीय है, और जावा में ऐसी कोई चीज़ नहीं है।

हालांकि, यदि आप एक अलग इंटरफ़ेस का उपयोग करने के इच्छुक हैं, तो आपके पास Commons Primitives ArrayByteList के साथ कुछ भाग्य हो सकता है। यह List<Byte> का एक साधारण सरणी नहीं है, क्योंकि इसे byte एस की वास्तविक सरणी द्वारा समर्थित किया गया है - इस प्रकार Byte ऑब्जेक्ट्स का उपयोग करने के कारण कोई मेमोरी ओवरहेड नहीं है। आपके पास अभी भी कुछ ऑब्जेक्ट ओवरहेड होगा, लेकिन यह व्यावहारिक उदाहरणों में स्वीकार्य है।

सबसे महत्वपूर्ण बात यह है कि यह ArrayByteList.subList() विधि के माध्यम से स्लाइस का समर्थन करता है, जो प्रति कॉपी नहीं करता है। आप source code देख सकते हैं, स्लाइस को प्रारंभिक और अंत स्थिति के लिए मूल सरणी के साथ दो मार्करों के संदर्भ के रूप में कार्यान्वित किया जाता है।

हालांकि, ध्यान रखें कि प्रतिलिपि से बचने का मतलब है कि स्लाइस में परिवर्तन मूल सरणी में दिखाई देता है। यह शायद आप जो चाहते हैं, लेकिन फिर भी बहुत सावधान रहें - खासकर अगर आप सी/सी ++ पृष्ठभूमि से नहीं आते हैं, जहां ये चीजें आम अभ्यास हैं।

संबंधित मुद्दे