2010-11-16 13 views
5

मैं पिछले सप्ताह के लिए हेक्स और बिटवाई मैनिपुलेशन (यहां और कहीं और) पर प्रश्न पूछ रहा हूं, जावा में उनके प्रतिनिधित्व के चारों ओर अपने सिर को लपेटने की कोशिश कर रहा हूं। बहुत गुगलिंग और क्रैग्रीन के बाद मुझे एक अंतिम बार पूछना चाहिए कि बिट्स पर लॉजिकल अंकगणित कैसे करें, जिन्हें हस्ताक्षर किया जाना चाहिए, लेकिन जावा में साइन इन के रूप में प्रतिनिधित्व किया जाता है।जावा में "हस्ताक्षरित" डेटा पर बिटवाई बाएं बदलावों को निष्पादित करना - जेएनआई में जाने के लिए बेहतर?

ठीक है: मैं जावा में एक सी # प्रोग्राम पोर्ट कर रहा हूं। कार्यक्रम बिटमैप मैनिपुलेशन के साथ सौदा करता है, और ऐप में इस तरह के अधिकांश डेटा को byte, एक हस्ताक्षरित 8-बिट पूर्णांक के रूप में दर्शाया गया है। इसके बजाय जावा में short डेटा प्रकार का उपयोग करने के लिए कई सुझाव हैं ताकि "नकल" के रूप में जितना संभव हो सके हस्ताक्षर किए गए 8-बाइट पूर्णांक।

मुझे लगता है कि के रूप में सी # कोड प्रदर्शन कर रहा है मेरे लिए संभव है पर विश्वास नहीं करते विभिन्न कई स्थानांतरण और और मेरी बाइट डाटा के साथ आपरेशनों। उदाहरण के लिए, यदि data एक बाइट सरणी है, और कोड के इस ब्लॉक सी # में मौजूद है:

int cmdtype = data[pos] >> 5; 
int len = (data[pos] & 0x1F) + 1; 

if (cmdtype == 7) 
{ 
    cmdtype = (data[pos] & 0x1C) >> 2; 
    len = ((data[pos] & 3) << 8) + data[pos + 1] + 1; 
    pos++; 
} 

यह सिर्फ एक short रूप data कास्टिंग और यह जावा में काम करने के लिए प्राप्त करने के लिए इसके साथ किया जा रहा है की एक साधारण बात नहीं है । जहां तक ​​तर्क का संबंध है, मेरा डेटा 8-बिट में हस्ताक्षर किए जाने की आवश्यकता महत्वपूर्ण है; 16-बिट हस्ताक्षरित ऊपर की तरह गणित पेंच होगा। क्या मैं यहाँ हूँ? वास्तव में, जावा में 0XFF और char के साथ पहले "नकली कास्टिंग" byte और सही परिणाम नहीं मिलने के बाद, मुझे डर है कि मैंने एक मृत अंत मारा।

अब, कोड के दूसरे हिस्से में, मैं कुछ बिटमैप पिक्सेल हेरफेर प्रदर्शन कर रहा हूँ। चूंकि यह एक लंबी चल रही प्रक्रिया है, इसलिए मैंने जेएनआई के माध्यम से देशी कोड पर कॉल करने का फैसला किया। मुझे हाल ही में एहसास हुआ कि वहां मैं uint8_t डेटा प्रकार का उपयोग कर सकता हूं और सी # byte डेटा प्रकार के निकटतम प्रतिनिधित्व प्राप्त कर सकता हूं।

क्या मेरी सभी डेटा-निर्भर कार्यक्षमता जेएनआई में संचालित करने का समाधान है? ऐसा लगता है कि पुनः लिखने और प्रदर्शन करने के लिए दोनों बेहद अक्षम हैं। क्या जावा में गणित को फिर से हल करने का समाधान है, इसलिए तर्क समान रहता है? सही लगता है, लेकिन इसमें एक एनीयरिसम प्रेरित करने की क्षमता है, दोषपूर्ण गणित का उल्लेख नहीं करना।

मैं किसी भी और सभी सुझावों की सराहना करता हूं।

+0

आप यह दर्शाता है क्या सी # बनाम क्या जावा कोड स्निपेट में हर कदम पर करता है टिप्पणी जोड़ने सकते हैं? मुझे नहीं लगता कि मैं उस कोड में सभी स्पॉट्स को पहेली कर सकता हूं जहां आप स्वयं को समस्याएं देख रहे हैं। –

+0

मेरे पास कुछ भी नहीं है जो मैं उत्तर के रूप में वर्गीकृत करता हूं, लेकिन यदि आप बहुत कम काम कर रहे हैं, तो मैं जेएनआई का उपयोग करके एक साधारण वर्ग लिखने का सुझाव देता हूं जो कि बहुत सारे कास्टिंग करने के बजाय करता है। इससे प्रदर्शन, डिबग्बिलिटी और पठनीयता को नुकसान पहुंचाएगा। भले ही, मैं सब कुछ जेएनआई में परिवर्तित करने से पहले कोड को प्रोफाइल कर दूंगा। उन क्षेत्रों पर ध्यान केंद्रित करें जिनकी आवश्यकता है। –

+0

@ जॉन मैं जेएनआई में इसे फिर से करने का प्रस्ताव नहीं कर रहा हूं - मैं बस सोच रहा था कि यह एक व्यवहार्य समाधान था या नहीं। – GJTorikian

उत्तर

3

बस एक ध्यान दें:: आप क्योंकि ऋणात्मक संख्याओं तार्किक बढ़ाया जाएगा, short के लिए सीधे डाली नहीं कर सकते हैं आप जावा में कम करने के लिए डाली थी, तो आप सिर्फ इतना कहना है कुछ की तरह सक्षम होना चाहिए।

है, बाइट 1111 1101 (-5) जब सीधे short लिए डाली 1111 1111 1111 1101 (-5) में परिणाम होगा, नहीं 0000 0000 1111 1101 (253)।जब आप डाली तुम एक और ऑपरेशन के साथ अग्रणी लोगों को निकालना होगा:

short shortValue = ((short)(byteValue)) & 0xFF; 

मैं जटिल सा हेरफेर पता की तरह यह संभव है, क्योंकि मैं एक जावा घुमाओ आवेदन के साथ एक विरासत द्विआधारी मैसेजिंग प्रोटोकॉल से निपटने में इस सटीक बात किया है । मैं अत्यधिक अनुशंसा करता हूं कि इस तरह से इसे दूर कर दें ताकि आपको केवल एक बार इसका सामना करना पड़े। चाहे इसका मतलब है कि कक्षा में अपने "बाइट्स" को शॉर्ट्स के रूप में स्टोर करने और रूपांतरण संचालन को संभालने के लिए, या एक स्थिर उपयोगिता को परिभाषित करना जो एक पास में रूपांतरण और बिट ऑपरेशन करता है, ताकि आप हमेशा बाइट्स स्टोर कर सकें।

+0

मुझे लगता है कि मेरा दिमाग सिर्फ तले हुए हैं। अगर मैं फ्लिप करता हूं और कास्ट करता हूं तो मेरा bitwise गणित वही रहेगा? जैसा कि मैंने पहले कहा था, मैं आपके द्वारा वर्णित सटीक तकनीक के साथ "नकली कास्टिंग" था, केवल इसके बजाय एक char का उपयोग कर रहा था। – GJTorikian

2

जावा >>> (ध्यान दें तीन ">" वर्ण, न सिर्फ दो) अहस्ताक्षरित सही-शिफ्ट ऑपरेटर है। इसे सी # शैली को कम-से-कम स्थानांतरित करना चाहिए (ऊपरी बिट्स शून्य पर साफ़ हो जाते हैं, साइन-भरे नहीं होते हैं)।

जहाँ तक एक 'लघु' के लिए कास्टिंग के रूप में, सी # वैसे भी शिफ्ट करने से पहले 32-बिट पूर्णांक के लिए उन सभी बाइट्स डाले। एकमात्र चाल है, सी # एक हस्ताक्षरित कलाकार करता है (बिट 7 के मूल्य के बावजूद, 0 के साथ ऊपरी 24 बिट भरता है)।

short shortCast = ((short)byteVal) & 0xff; 
short shiftedShortCast = shortCast << whatever; 
+0

यह सच है कि सी # एक 'int' में परिवर्तित हो जाता है, लेकिन इसमें अनगिनत प्रकार की अवधारणा भी है, जो अग्रणी लोगों को नकारात्मक संख्याओं में विस्तार से रखने में रखती है। – jdmichal

+0

अच्छा बिंदु @jdmichal। मैं प्रतिक्रिया संपादित करूंगा। –