मैं पिछले सप्ताह के लिए हेक्स और बिटवाई मैनिपुलेशन (यहां और कहीं और) पर प्रश्न पूछ रहा हूं, जावा में उनके प्रतिनिधित्व के चारों ओर अपने सिर को लपेटने की कोशिश कर रहा हूं। बहुत गुगलिंग और क्रैग्रीन के बाद मुझे एक अंतिम बार पूछना चाहिए कि बिट्स पर लॉजिकल अंकगणित कैसे करें, जिन्हें हस्ताक्षर किया जाना चाहिए, लेकिन जावा में साइन इन के रूप में प्रतिनिधित्व किया जाता है।जावा में "हस्ताक्षरित" डेटा पर बिटवाई बाएं बदलावों को निष्पादित करना - जेएनआई में जाने के लिए बेहतर?
ठीक है: मैं जावा में एक सी # प्रोग्राम पोर्ट कर रहा हूं। कार्यक्रम बिटमैप मैनिपुलेशन के साथ सौदा करता है, और ऐप में इस तरह के अधिकांश डेटा को 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
डेटा प्रकार के निकटतम प्रतिनिधित्व प्राप्त कर सकता हूं।
क्या मेरी सभी डेटा-निर्भर कार्यक्षमता जेएनआई में संचालित करने का समाधान है? ऐसा लगता है कि पुनः लिखने और प्रदर्शन करने के लिए दोनों बेहद अक्षम हैं। क्या जावा में गणित को फिर से हल करने का समाधान है, इसलिए तर्क समान रहता है? सही लगता है, लेकिन इसमें एक एनीयरिसम प्रेरित करने की क्षमता है, दोषपूर्ण गणित का उल्लेख नहीं करना।
मैं किसी भी और सभी सुझावों की सराहना करता हूं।
आप यह दर्शाता है क्या सी # बनाम क्या जावा कोड स्निपेट में हर कदम पर करता है टिप्पणी जोड़ने सकते हैं? मुझे नहीं लगता कि मैं उस कोड में सभी स्पॉट्स को पहेली कर सकता हूं जहां आप स्वयं को समस्याएं देख रहे हैं। –
मेरे पास कुछ भी नहीं है जो मैं उत्तर के रूप में वर्गीकृत करता हूं, लेकिन यदि आप बहुत कम काम कर रहे हैं, तो मैं जेएनआई का उपयोग करके एक साधारण वर्ग लिखने का सुझाव देता हूं जो कि बहुत सारे कास्टिंग करने के बजाय करता है। इससे प्रदर्शन, डिबग्बिलिटी और पठनीयता को नुकसान पहुंचाएगा। भले ही, मैं सब कुछ जेएनआई में परिवर्तित करने से पहले कोड को प्रोफाइल कर दूंगा। उन क्षेत्रों पर ध्यान केंद्रित करें जिनकी आवश्यकता है। –
@ जॉन मैं जेएनआई में इसे फिर से करने का प्रस्ताव नहीं कर रहा हूं - मैं बस सोच रहा था कि यह एक व्यवहार्य समाधान था या नहीं। – GJTorikian