سؤال

ولست بحاجة لاتخاذ أزواج من وحدات البايت في، والسراويل الإخراج، واتخاذ السراويل القصيرة في وأزواج إخراج بايت. وفيما يلي وظائف لقد وضعت لهذا الغرض:

static short ToShort(short byte1, short byte2)
{
    short number = (short)byte2;
    number <<= 4;
    number += (short)byte1;
    return number;
}
static void FromShort(short number, out byte byte1, out byte byte2)
{
    byte byte2 = (byte)(number >> 4);
    short tempByte = (short)byte2 << 4;
    byte byte1 = (byte)(number - tempByte);
}

وأعتقد أن هذا هو الصحيح ولكن لست متأكدا. إذا كان هذا ليس هو الطريق الصحيح لتحقيق ذلك، ما هو؟ هل هناك طريقة للقيام بذلك بالفعل في إطار؟

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

المحلول

ونسخة أقصر (التحول أيضا 8 بت بدلا من 4):

static short ToShort(short byte1, short byte2)
{
    return (byte2 << 8) + byte1;
}

static void FromShort(short number, out byte byte1, out byte byte2)
{
    byte2 = (byte)(number >> 8);
    byte1 = (byte)(number & 255);
}

نصائح أخرى

استخدم BitConverter

short number = 42;
byte[] numberBytes = BitConverter.GetBytes(number);
short converted = BitConverter.ToInt16(numberBytes);

بايت هي 8 بت، وليس 4، لذلك التحول هو خارج. يمكنك أيضا تعريف المتغيرات المحلية في الوظيفة الثانية بحيث أنك لن ينتهي من كتابة المعلمات out مثل تعتزمون. كما انها أكثر وضوحا / أفضل إذا كنت تحد نفسك لالمختصة بالبت عمليات (&، |، و~) كلما كان ذلك ممكنا.

static short ToShort(byte byte1, byte byte2)
{
    return (short) ((byte2 << 8) | (byte1 << 0));
}

static void FromShort(short number, out byte byte1, out byte byte2)
{
    byte2 = (byte) (number >> 8);
    byte1 = (byte) (number >> 0);
}

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

إذا كنت تريد أن تأخذ بايت ... تأخذ بايت. والتحولات الخاصة بك قبالة، وسوف | أن يكون أكثر بديهية:

static short ToShort(byte byte1, byte byte2)
{   // using Int32 because that is what all the operations return anyway...
    return (short)((((int)byte1) << 8) | (int)byte2);
}
static void FromShort(short number, out byte byte1, out byte byte2)
{
    byte1 = (byte)(number >> 8); // to treat as same byte 1 from above
    byte2 = (byte)number;
}

وSystem.BitConverter

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