2009-08-21 11 views
9

मैं मैं हेक्स मान की एक सरणी के लिए pic.bmp कन्वर्ट करने के लिए तो मैं संपादित करें और एक संशोधित संस्करण के रूप में सहेज सकते हैं जावाजावा: हेक्स फ़ाइल?

FileInputStream in = null; 
try{  
in = new FileInputStream("C:\\pic.bmp"); 
}catch{} 

में एक फ़ाइल है।

क्या ऐसा करने के लिए कोई जावा क्लास है?

+2

विम में 'हेक्सडम्प', 'हेक्सेडिट' या बस ':%! xxd' जैसे टूल का उपयोग करना आसान नहीं होगा? –

उत्तर

19

आप भाग्यशाली हैं। मुझे इसे कुछ महीने पहले करना था। यहां एक डंबेड-डाउन संस्करण है जो कमांड लाइन से दो पैरामीटर लेता है। कॉमांड लाइन पैरामीटर दोनों फ़ाइल नाम हैं ... पहला इनपुट फ़ाइल है और दूसरा आउटपुट फ़ाइल है। इनपुट फ़ाइल बाइनरी में पढ़ी जाती है और आउटपुट फ़ाइल ASCII हेक्स के रूप में लिखा जाता है। उम्मीद है कि आप इसे अपनी जरूरतों के अनुरूप ही अनुकूलित कर सकते हैं।

import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileWriter; 
import java.io.IOException; 

public class BinToHex 
{ 
    private final static String[] hexSymbols = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" }; 

    public final static int BITS_PER_HEX_DIGIT = 4; 

    public static String toHexFromByte(final byte b) 
    { 
     byte leftSymbol = (byte)((b >>> BITS_PER_HEX_DIGIT) & 0x0f); 
     byte rightSymbol = (byte)(b & 0x0f); 

     return (hexSymbols[leftSymbol] + hexSymbols[rightSymbol]); 
    } 

    public static String toHexFromBytes(final byte[] bytes) 
    { 
     if(bytes == null || bytes.length == 0) 
     { 
      return (""); 
     } 

     // there are 2 hex digits per byte 
     StringBuilder hexBuffer = new StringBuilder(bytes.length * 2); 

     // for each byte, convert it to hex and append it to the buffer 
     for(int i = 0; i < bytes.length; i++) 
     { 
      hexBuffer.append(toHexFromByte(bytes[i])); 
     } 

     return (hexBuffer.toString()); 
    } 

    public static void main(final String[] args) throws IOException 
    { 
     try 
     { 
      FileInputStream fis = new FileInputStream(new File(args[0])); 
      BufferedWriter fos = new BufferedWriter(new FileWriter(new File(args[1]))); 

      byte[] bytes = new byte[800]; 
      int value = 0; 
      do 
      { 
       value = fis.read(bytes); 
       fos.write(toHexFromBytes(bytes)); 

      }while(value != -1); 

      fos.flush(); 
      fos.close(); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

धन्यवाद! मुझे ठीक इसी की आवश्यकता थी। आपने धमाल मचाया! – BinRoot

+1

@ निक: यह सवाल से स्पष्ट था कि यह वही है जो आप चाहते थे ... –

+0

यदि आपका वेतन कोड की रेखाओं पर निर्भर करता है, तो आप कथनों पर 256 लिख सकते हैं :) –

3

जावा में एक व्यापक छवि पढ़ने/लिखने और संपादन पुस्तकालय है। javax.imageio पैकेज देखें (यहां documentation है)। आप शायद ImageIO का उपयोग कर बनाना चाहते हैं और फिर BufferedImage ऑब्जेक्ट से छवि डेटा तक पहुंच सकते हैं (इसके लिए विधियां हैं)।

यदि आप किसी सामान्य प्रकार के बाइनरी डेटा (केवल छवियों के लिए) के लिए सामान्य जवाब चाहते हैं, तो मुझे लगता है कि आपको फ़ाइल की सामग्री को बाइट सरणी में पढ़ना होगा। कुछ इस तरह:

byte[] bytes = new byte[in.available()]; 
in.read(bytes); 
+0

मैं किसी भी फ़ाइल में हेक्स में कनवर्ट करने में सक्षम होना चाहता हूं चाहे वह एक छवि हो या निष्पादन योग्य या ज़िप संग्रह हो। तो क्या मान को बदलने और नई संशोधित फ़ाइल के रूप में सहेजने के लिए फ़ाइल को बाइनरी या हेक्साडेसिमल के रूप में पढ़ने का कोई सामान्य तरीका नहीं है? – BinRoot

+2

in.read (बाइट्स) ऐसा करने का सबसे सामान्य तरीका है। यदि आप हेक्स में आउटपुट नंबर बनाना चाहते हैं, तो System.out.printf ("% X", बाइट्स [0]) का उपयोग करें; –

0

आप बाइट्स के साथ खुद को बेला के लिए, FileInputStream से एक FileChannel मिलता है, और फिर एक ByteBuffer आवंटित और फिर इसे में सभी सामग्री को पढ़ने चाहते हैं। बाइटबफर में दो अलग बाइट ऑर्डर में बाइट्स के बड़े हिस्से से निपटने के तरीके भी हैं।

1

आप एक गूगल खोज में "जावा hexidecimal एन्कोडिंग" लिखते हैं, तो पहला परिणाम http://commons.apache.org/codec/api-release/org/apache/commons/codec/binary/Hex.html है है जो आप भाग "मैं हेक्स मान की एक सरणी के लिए pic.bmp कनवर्ट करना चाहते हैं" जवाब देने के लिए उपयोग करना चाहिए आपके प्रश्न का

मुझे नहीं लगता कि यह आपको कैसे मदद करता है "इसलिए मैं इसे एक संशोधित संस्करण के रूप में संपादित और सहेज सकता हूं"। आपको इसके लिए हेक्साइडसिमल संपादक का उपयोग करना चाहिए। जैसे। ghex2

+0

अपडेट किया गया यूआरएल: http://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/binary/Hex.html –

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