سؤال

أنا أحاول تحويل HEX-تسلسل سلسلة المشفرة في إما ، ISO-8859-1, UTF-8 أو UTF-16BE.أن سلسلة يبحث مثل: "0422043504410442" تمثل هذه الشخصيات: "Test" في UTF-16BE.

مدونة أنا استخدامها لتحويل بين صيغ هي:

private static String hex2String(String hex, String encoding) throws UnsupportedEncodingException {
    char[] hexArray = hex.toCharArray();

    int length = hex.length() / 2;
    byte[] rawData = new byte[length];
    for(int i=0; i<length; i++){
        int high = Character.digit(hexArray[i*2], 16);
        int low = Character.digit(hexArray[i*2+1], 16);
        int value = (high << 4) | low;
        if( value > 127)
                value -= 256;
        rawData[i] = (byte) value;
    }
    return new String(rawData, encoding);
}

هذا ويبدو أن تعمل بشكل جيد بالنسبة لي, ولكن لا يزال لدي سؤالين اثنين بخصوص هذا:

  1. هل هناك أي طريقة أبسط (ويفضل أن يكون من دون بت التعامل مع) أن تفعل هذا التحويل ؟
  2. كيف لي أن تفسير الخط: int value = (high << 4) | low;?

وأنا على دراية أساسيات بت التعامل ، وإن لم يكن على الإطلاق مع تركيب جافا.أعتقد أن الجزء الأول تحول كل بت إلى اليسار عن طريق 4 خطوات.على الرغم من أن بقية أنا لا أفهم لماذا سيكون من المفيد في هذا الوضع.

أعتذر عن أي التباس في سؤالي من فضلك اسمحوا لي أن أعرف إذا أنا يجب أن يوضح أي شيء.شكرا لك.//Abeansits

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

المحلول

هل هناك أي طريقة أبسط (ويفضل أن يكون من دون بت التعامل مع) أن تفعل هذا التحويل ؟

لا أود أن أعرف فقط تبسيط يبدو أن تحليل كامل بايت دفعة واحدة بدلا من تحليل أرقام من أرقام (على سبيل المثالباستخدام int value = Integer.parseInt(hex.substring(i * 2, i * 2 + 2), 16);)

public static byte[] hexToBytes(final String hex) {
  final byte[] bytes = new byte[hex.length() / 2];
  for (int i = 0; i < bytes.length; i++) {
    bytes[i] = (byte) Integer.parseInt(hex.substring(i * 2, i * 2 + 2), 16);
  }
  return bytes;
}

كيف لي أن تفسير الخط:int value = (عالية << 4) | منخفضة؛?

انظروا إلى هذا المثال على آخر رقمين (42):

int high = 4; // binary 0100
int low = 2; // binary 0010
int value = (high << 4) | low;

int value = (0100 << 4) | 0010; // shift 4 to left
int value = 01000000 | 0010; // bitwise or
int value = 01000010;
int value = 66; // 01000010 == 0x42 == 66

نصائح أخرى

يمكنك استبدال << و | في هذه الحالة مع * و +, ولكن أنا لا أوصي به.

التعبير

int value = (high << 4) | low;

ما يعادل

int value = high * 16 + low;

الطرح من 256 إلى الحصول على قيمة بين -128 و 127 لا لزوم لها.ببساطة صب ، على سبيل المثال ، إلى 128 بايت سوف تنتج النتيجة الصحيحة.وهو أدنى مستوى 8 بت int 128 لديهم نفس نمط byte -128:0x80.

كنت أكتب ببساطة كما يلي:

rawData[i] = (byte) ((high << 4) | low);

هل هناك أي طريقة أبسط (يفضل دون بت المناولة) للقيام بذلك التحويل ؟

يمكنك استخدام عرافة الدرجة في أباتشي العموم ، ولكن داخليا ، وسوف تفعل الشيء نفسه ، وربما مع اختلافات طفيفة.

كيف لي أن تفسير الخط: int value = (high << 4) | low;?

هذا يجمع بين اثنين من عرافة أرقام يمثل كل منهما 4 بت في واحد غير موقعة 8 بت القيمة المخزنة كما int.المقبلين خطوط تحويل هذا إلى توقيع جافا byte.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top