سؤال

عندما يكون لدي سلسلة مثل "0xD8 0xFF 0xE0" أنا أفعل

Text.Split(' ').Select(part => byte.Parse(part, System.Globalization.NumberStyles.HexNumber)).ToArray();

ولكن إذا حصلت على سلسلة مثل "0xd8ffe0" لا أعرف ماذا أفعل؟

كما أنني قادر على توصيات كيفية كتابة مجموعة البايت كسلسلة واحدة.

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

المحلول

تحتاج إلى فرك السلسلة الخاصة بك قبل البدء في تحليلها. أولاً ، قم بإزالة 0x الرائدة ، ثم تخطي أي مسافات أثناء تعداد السلسلة. لكن استخدام LINQ لهذا ربما لا يكون أفضل طريقة. لأحد ، لن يكون الرمز قابلاً للقراءة للغاية وسيكون من الصعب التنقل إذا كنت تصحيح الأخطاء. ولكن أيضًا ، هناك بعض الحيل التي يمكنك القيام بها لإجراء تحويلات Hex/Byte بسرعة كبيرة. على سبيل المثال ، لا تستخدم byte.parse ، ولكن بدلاً من ذلك استخدم فهرسة Array "للبحث عن القيمة المقابلة.

بعد الظهر ، قمت بتطبيق فئة سداسية مستمدة من فئة قاعدة الترميز مثل Asciiencoding و utf8encoding ، وما إلى ذلك. باستخدامه أمر بسيط للغاية. تم تحسينه جيدًا أيضًا والذي يمكن أن يكون مهمًا جدًا اعتمادًا على حجم بياناتك.

var enc = new HexEncoding();
byte[] bytes = enc.GetBytes(str); // convert hex string to byte[]
str = enc.GetString(bytes);       // convert byte[] to hex string

إليكم الفصل الكامل ، أعرف أنه أمر كبير نوعًا ما ، لكنني جردت تعليقات المستند.

public sealed class HexEncoding : Encoding
{

    public static readonly HexEncoding Hex = new HexEncoding( );

    private static readonly char[] HexAlphabet;
    private static readonly byte[] HexValues;

    static HexEncoding( )
    {

        HexAlphabet = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

        HexValues = new byte[255];
        for ( int i = 0 ; i < HexValues.Length ; i++ ) {
            char c = (char)i;
            if ( "0123456789abcdefABCDEF".IndexOf( c ) > -1 ) {
                HexValues[i] = System.Convert.ToByte( c.ToString( ), 16 );
            }   // if
        }   // for

    }

    public override string EncodingName
    {
        get
        {
            return "Hex";
        }
    }

    public override bool IsSingleByte
    {
        get
        {
            return true;
        }
    }

    public override int GetByteCount( char[] chars, int index, int count )
    {
        return count / 2;
    }

    public override int GetBytes( char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex )
    {

        int ci = charIndex;
        int bi = byteIndex;

        while ( ci < ( charIndex + charCount ) ) {

            char c1 = chars[ci++];
            char c2 = chars[ci++];

            byte b1 = HexValues[(int)c1];
            byte b2 = HexValues[(int)c2];

            bytes[bi++] = (byte)( b1 << 4 | b2 );

        }   // while

        return charCount / 2;

    }

    public override int GetCharCount( byte[] bytes, int index, int count )
    {
        return count * 2;
    }

    public override int GetChars( byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex )
    {

        int ci = charIndex;
        int bi = byteIndex;

        while ( bi < ( byteIndex + byteCount ) ) {

            int b1 = bytes[bi] >> 4;
            int b2 = bytes[bi++] & 0xF;

            char c1 = HexAlphabet[b1];
            char c2 = HexAlphabet[b2];

            chars[ci++] = c1;
            chars[ci++] = c2;

        }   // while

        return byteCount * 2;

    }

    public override int GetMaxByteCount( int charCount )
    {
        return charCount / 2;
    }

    public override int GetMaxCharCount( int byteCount )
    {
        return byteCount * 2;
    }

}   // class

نصائح أخرى

  1. عرافة String إلى byte[]:

    byte[] bytes = new byte[value.Length / 2];
    for (int i = 0; i < value.Length; i += 2)
    {
        bytes[i / 2] = Convert.ToByte(value.Substring(i, 2), 16);
    }
    

    اذا كنت تمتلك "0x" في البداية يجب أن تتخطى بايتين.

  2. byte[] أو أي IEnumerable<Byte> -> Hex String:

    return sequence.Aggregate(string.Empty,
                              (result, value) =>  result + 
                                                  string.Format(CultureInfo.InvariantCulture, "{0:x2}", value));
    
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top