2012-07-25 8 views
10

कहें कि मेरे पास डेटा का संग्रह है (उदाहरण: स्ट्रिंग्स) जिसे एक बाइनरी फ़ाइल में संग्रहीत किया जाना चाहिए ताकि प्रत्येक स्ट्रिंग कहें, 4-बाइट गठबंधन है।एन-बाइट संरेखण के लिए आवश्यक कंप्यूटिंग पैडिंग

तो यदि मेरे पास लंबाई 11 की स्ट्रिंग है, तो यह 12 (नल बाइट्स के साथ) तक गद्दी होगी।
यदि मेरे पास लंबाई 24 की एक स्ट्रिंग है, तो कोई पैडिंग आवश्यक नहीं है।
यदि मेरी स्ट्रिंग की लंबाई 6 है, तो यह 8 बाइट्स तक गद्देदार हो जाएगी।

मैं एक अभिव्यक्ति में आवश्यक पैडिंग की मात्रा की गणना कैसे करूं?

मैं 4 - (string_length % 4) की कोशिश की लेकिन यह विफल रहता है जब मेरे स्ट्रिंग की लंबाई 4.

उत्तर

13

यह अजीब लग रहा है की एक बहु है, लेकिन सही जवाब देता है:

(4 - (string_length % 4)) % 4 
+0

की गद्दी आकार आह करने के लिए संख्या 'ऊपर दौर', परिणाम संशोधित करें। उस बारे में सोचा नहीं था। – MxyL

11

एक तेज़ तरीका गद्दी गणना करने के लिए नहीं है, अगर संरेखण दो की शक्ति है (2,4,8, ...)। निम्नलिखित चलता है क्योंकि बाइनरी & दो की शक्तियों के लिए% के समान है: %(2^x) और &(2^x-1) सकारात्मक संख्याओं के लिए समान है। ध्यान दें: & साइन बिट हटा देगा और इसलिए हमेशा सकारात्मक मॉड्यूलो परिणाम देता है।

तो (4 - (string_length & 3)) & 3(4 - (string_length % 4)) % 4 जैसा ही होगा। सकारात्मक मॉड्यूलो प्रॉपर्टी का उपयोग करके इसे (-string_length) & 3 पर सरलीकृत किया जा सकता है!


आप आकार करने के लिए है कि परिणाम को जोड़ने आप और भी अधिक अनुकूलन कर सकते हैं करना चाहते हैं, तो:

padded_length = (string_length + 3) & ~3 शब्दार्थ इस 4.

+1

क्या इस तकनीक के लिए मानक नाम है? –

0
public static final int getByteAlignedIndex(final int pVariableDataIndex, final int pVariableDataLength, final int pByteAlignment) { 
    return pVariableDataIndex + (pVariableDataLength & 0xFFFFFFFC) + ((((pVariableDataLength & 0b1)|((pVariableDataLength & 0b10) >> 1))) << 2); 
} 
संबंधित मुद्दे