जावा स्ट्रिंग को ASCII बाइट सरणी में कैसे बदलें?


जवाबों:


157

getBytesविधि का उपयोग करना , इसे उपयुक्त Charset(या Charsetनाम) देना।

उदाहरण:

String s = "Hello, there.";
byte[] b = s.getBytes(StandardCharsets.US_ASCII);

(जावा 7 से पहले: byte[] b = s.getBytes("US-ASCII");)


10
मैं हल्के से शर्मिंदा हूँ कि यह कितना आसान था।
फार्म शुतुरमुर्ग

4
यह '\ u00e0' (& agrave?) जैसे अयोग्य वर्णों को '?' में रूपांतरित करेगा। यह एक ऐसा तरीका होगा जो एक ऐसा तरीका है जो कि 'ए' में परिवर्तित हो।
अर्नआउट एंगेलन

11
जावा 7 या बाद के संस्करण का उपयोग करने वाले लोगों के लिए, मानक Standardharets का उपयोग करें जिसमें मानक वर्णमाला के लिए कुछ स्थिरांक होते हैं। byte[] b = s.getBytes(StandardCharsets.US_ASCII);
एलेक्सिस सी।

23

अगर आप ए उपयोगकर्ता एक आसान Charsetsवर्ग है:

String s = "Hello, world!";
byte[] b = s.getBytes(Charsets.US_ASCII);

आपके स्रोत कोड में हार्ड-कोडिंग मनमाने ढंग से नाम न रखने के अलावा इसका एक बहुत बड़ा फायदा है: Charsets.US_ASCIIयह Charsetप्रकार का है (नहीं String) तो आप UnsupportedEncodingExceptionकेवल फेंके गए चेक से बचें String.getBytes(String), लेकिन इससे नहीं String.getBytes(Charset)

जावा 7 में बराबर StandardCharsetsक्लास है।


दुख की बात String.getBytes(Charset)यह है कि एपीआई 9 :( तक जोड़ा नहीं गया था , इसलिए यदि आप Froyo और इसके बाद के संस्करण को लक्षित करना चाहते हैं, तो आप ऐसा नहीं कर सकते हैं।
yincrash

5

आपके द्वारा आजमाए गए कोड में केवल एक वर्ण गलत है:

Charset characterSet = Charset.forName("US-ASCII");
String string = "Wazzup";
byte[] bytes = String.getBytes(characterSet);
               ^

ऊपरी स्थिति "स्ट्रिंग" पर ध्यान दें। यह स्ट्रिंग क्लास पर एक स्थिर विधि को लागू करने की कोशिश करता है, जो मौजूद नहीं है। इसके बजाय आपको अपनी स्ट्रिंग आवृत्ति पर विधि को लागू करने की आवश्यकता है:

byte[] bytes = string.getBytes(characterSet);

यदि हां, तो क्या आप मुझे बता सकते हैं कि यह कैसे हो सकता है कि एक हेब्रो लेटर 1 बाइट (एससीआई एन्कोडिंग) लिया जाता है, यह एसेंटी में भी मौजूद नहीं है। और यह मैन्युअल रूप से निर्दिष्ट के बाद से डिफ़ॉल्ट एनकोडिंग का उपयोग नहीं कर रहा है। i.stack.imgur.com/5WPD3.jpg
Royi Namir

@RoyiNamir: यह एक नए प्रश्न के रूप में बेहतर रूप से पोस्ट किया जा सकता है, लेकिन इसका कारण यह है कि चरित्र US-ASCII में एन्कोडेबल नहीं है और यह getBytes(Charset)विधि उन वर्णों को प्रतिस्थापित करने के लिए निर्दिष्ट है जिन्हें एन्कोड नहीं किया जा सकता है। US-ASCII के साथ, यह प्रतिस्थापन चार्ट प्रश्न चिह्न है, इसलिए आपके बाइट सरणी में '?' के ASCF मान के साथ एक तत्व है? (६३) है।
जोर्न होर्स्टमन

5

अन्य प्रस्तावित समाधानों के साथ समस्या यह है कि वे या तो उन वर्णों को छोड़ देंगे जिन्हें सीधे ASCII पर मैप नहीं किया जा सकता है, या उन्हें एक मार्कर वर्ण की तरह बदल सकते हैं ?

आप उदाहरण के लिए उच्चारण उच्चारण चरित्र के बिना उसी चरित्र में परिवर्तित करने की इच्छा कर सकते हैं। ऐसा करने के लिए कुछ ट्रिक्स हैं (जिसमें स्वयं एक स्टैटिक मैपिंग टेबल बनाना या यूनिकोड के लिए मौजूदा 'सामान्यीकरण' का लाभ उठाना शामिल है), लेकिन वे विधियाँ पूरी तरह से दूर हैं।

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



4

यदि आपको Android में इसकी आवश्यकता है और आप इसे FroYo से अधिक पुरानी किसी भी चीज़ के साथ काम करना चाहते हैं, तो आप EncodingUtils.getAsciiBytes () का भी उपयोग कर सकते हैं :

byte[] bytes = EncodingUtils.getAsciiBytes("ASCII Text");

1
यह वास्तव में एक बहुत अच्छा टिप है! Android getBytes पर (...) ICS + पर भी ठीक से काम नहीं करता है
अजीब

मुझे कहीं भी एन्कोडिंग यूटिल्स नहीं मिल रहे हैं?
बेथेल

1
@behelit अगर आप मेरे लिंक का अनुसरण करते हैं तो यह इस बिट पर पुनर्निर्देशित करता है: developer.android.com/about/versions/marshmallow/…। मूल रूप से यह कहते हुए कि आपको अपाचे HTTP लाइब्रेरी को मैन्युअल रूप से शामिल करने की आवश्यकता है क्योंकि यह अब समाप्त हो गया है।
11:16

लेकिन अगर आप डॉक्स के लिए देख रहे हैं, "अपाचे HTTP encodingutils" के लिए खोज की तरह कुछ उपयोगी परिणाम देता है: hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/...
dain

3

मेरे स्ट्रिंग में मेरे पास थाई अक्षर (TIS620 एन्कोडेड) और जर्मन umlauts हैं। चुस्त से जवाब मुझे सही रास्ते पर डाल दिया। .GetBytes () के बजाय अब मैं उपयोग करता हूं

  int len = mString.length(); // Length of the string
  byte[] dataset = new byte[len];
  for (int i = 0; i < len; ++i) {
     char c = mString.charAt(i);
     dataset[i]= (byte) c;
  }

0

स्ट्रिंग को ascii मान में बदलें।

   String test = "ABCD";

   for ( int i = 0; i < test.length(); ++i ) {
   char c = test.charAt( i );
   int j = (int) c;
   System.out.println(j);
   }

0

मुझे इसका हल मिल गया। दरअसल Android में Base64 क्लास उपलब्ध नहीं है। अधिक जानकारी के लिए नीचे लिंक दिया गया है।

byte[] byteArray;                                                  
     byteArray= json.getBytes(StandardCharsets.US_ASCII);
    String encoded=Base64.encodeBytes(byteArray);
    userLogin(encoded);

यहाँ Base64 वर्ग के लिए लिंक दिया गया है: http://androidcodemonkey.blogspot.com/2010/03/how-to-base64-encode-decode-android.html


-2

इसे इस्तेमाल करे:

/**
 * @(#)demo1.java
 *
 *
 * @author 
 * @version 1.00 2012/8/30
 */

import java.util.*;

public class demo1 
{
    Scanner s=new Scanner(System.in);

    String str;
    int key;

    void getdata()
    {
        System.out.println ("plase enter a string");
        str=s.next();
        System.out.println ("plase enter a key");
        key=s.nextInt();
    }

    void display()
    {
        char a;
        int j;
        for ( int i = 0; i < str.length(); ++i )
        {

            char c = str.charAt( i );
            j = (int) c + key;
            a= (char) j;

            System.out.print(a);  
        }

        public static void main(String[] args)
        {
            demo1 obj=new demo1();
            obj.getdata();
            obj.display();
        }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.