سؤال

لديّ سلسلة تحتوي على بيانات ثنائية (1110100) أريد الحصول على النص حتى أتمكن من طباعته (سيقوم 1110100 بطباعة "T"). لقد جربت هذا ، إنه مشابه لما اعتدت عليه لتحويل نصي إلى ثنائي ولكنه لا يعمل على الإطلاق:

    public static String toText(String info)throws UnsupportedEncodingException{
        byte[] encoded = info.getBytes();
        String text = new String(encoded, "UTF-8");
        System.out.println("print: "+text);
        return text;
    }

أي تصحيحات أو اقتراحات ستكون موضع تقدير كبير.

شكرًا!

هل كانت مفيدة؟

المحلول

يمكنك استخدام Integer.parseInt مع Radix من 2 (ثنائي) لتحويل السلسلة الثنائية إلى عدد صحيح:

int charCode = Integer.parseInt(info, 2);

ثم إذا كنت تريد الحرف المقابل كسلسلة:

String str = new Character((char)charCode).toString();

نصائح أخرى

أعلم أن OP صرح أن ثنائيهم كان في أ String التنسيق ولكن من أجل الاكتمال اعتقدت أنني سأضيف حلًا للتحويل مباشرة من أ byte[] إلى تمثيل سلسلة أبجدية.

مثل الدار البيضاء ذكرت أنك بحاجة أساسًا إلى الحصول على التمثيل العددي للشخصية الأبجدية. إذا كنت تحاول تحويل أي شيء أطول من شخصية واحدة ، فمن المحتمل أن يأتي ك byte[] وبدلاً من تحويل ذلك إلى سلسلة ثم استخدام حلقة لإلحاق أحرف كل منها byte يمكنك استخدام Bytebuffer و شاربوفر للقيام بالرفع لك:

public static String bytesToAlphabeticString(byte[] bytes) {
    CharBuffer cb = ByteBuffer.wrap(bytes).asCharBuffer();
    return cb.toString();
}

NB يستخدم UTF Char Set

بدلاً من ذلك باستخدام مُنشئ السلسلة:

String text = new String(bytes, 0, bytes.length, "ASCII");

هذا هو واحد (يعمل بشكل جيد على Java 8):

String input = "01110100"; // Binary input as String
StringBuilder sb = new StringBuilder(); // Some place to store the chars

Arrays.stream( // Create a Stream
    input.split("(?<=\\G.{8})") // Splits the input string into 8-char-sections (Since a char has 8 bits = 1 byte)
).forEach(s -> // Go through each 8-char-section...
    sb.append((char) Integer.parseInt(s, 2)) // ...and turn it into an int and then to a char
);

String output = sb.toString(); // Output text (t)

والطريقة المضغوطة الطباعة إلى وحدة التحكم:

Arrays.stream(input.split("(?<=\\G.{8})")).forEach(s -> System.out.print((char) Integer.parseInt(s, 2))); 
System.out.print('\n');

أنا متأكد من أن هناك طرق "أفضل" للقيام بذلك ، لكن هذه هي أصغر طريقة يمكنك الحصول عليها.

ها هو الجواب.

private String[] splitByNumber(String s, int size) {
    return s.split("(?<=\\G.{"+size+"})");
}

في الاتجاه الآخر (حيث "المعلومات" هو نص الإدخال و "S" النسخة الثنائية منه)

byte[] bytes = info.getBytes();
BigInteger bi = new BigInteger(bytes);
String s = bi.toString(2); 

انظر الى parseInt وظيفة. قد تحتاج أيضًا إلى فريق عمل Character.toString وظيفة.

public static String binaryToText(String binary) {
    return Arrays.stream(binary.split("(?<=\\G.{8})"))/* regex to split the bits array by 8*/
                 .parallel()
                 .map(eightBits -> (char)Integer.parseInt(eightBits, 2))
                 .collect(
                                 StringBuilder::new,
                                 StringBuilder::append,
                                 StringBuilder::append
                 ).toString();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top