سؤال

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

هل هناك طريقة أستطيع أن تحويل الباحث "4096" إلى 3 بايت؟ أو "1053" في 2 بايت؟

ومن الواضح أن CNA القيام بذلك يدويا = (البايت [0] * 256) + (البايت [1])، ولكن أنا أتساءل عما إذا كان هناك خيار أسهل لتحويل الباحث إلى العاشر بايت والعودة مرة أخرى؟

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

المحلول

هل أنت؟ بالتأكيد. هل حفظ أي الفضاء؟ ربما، وهذا يتوقف على مقدار العمل الذي تريد القيام به. يجب أن نفهم أن المعالج هو 32 بت، وهذا يعني أن لديها 4 سجلات بايت، لذلك هذه هي الطريقة انها تريد الذهاب الى لتخزين وأشياء الوصول. لفرض "كثافة" بايت 3 عليك أن يبقيه في صفيف بايت، واستخراجها من مجموعة إلى عنوان الانحياز قبل الاستخدام. وهذا يعني أنه إذا قمت بتخزينها باختصار، فإن المترجم إما لوحة بها (وسوف تفقد أي كفاءة كنت تعتقد أنك قد خلق) أو أنها ستكون <م> الكثير أبطأ القراءة والكتابة.

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

ويهمني القول انه اذا 1 بايت حقا هو المهم، أنه ربما، ربما فقط، كنت تستخدم لغة خاطئة على أي حال. عدد البايتات كنت حفظ بلدي لا تثبيت واستخدام CLR في المقام الأول هو الكثير من تلك بايت.

ملاحظة جانبية: أنت تريد أن تفعل تحول، وليس الضرب (على الرغم من أن المجمع سوف تحصل على الأرجح هناك لك)

نصائح أخرى

ولمجرد الجنون المضافة، دعونا نفعل ذلك في C # باستخدام القديمة خدعة اتحاد على غرار C:

[StructLayout(LayoutKind.Explicit)]
struct OddUnion
{
    /* The 32-bit integer value */
    [FieldOffset(0)]
    public int IntegerValue;

    /* The bytes that overlap with it */
    [FieldOffset(0)]
    public byte Byte1;
    [FieldOffset(1)]
    public byte Byte2;
    [FieldOffset(2)]
    public byte Byte3;
    [FieldOffset(3)]
    public byte Byte4;
 }

وبعد ذلك، عندما تريد "تحويل"، قيام بذلك:

OddUnion myOddUnion;
myOddUnion.IntegerValue = 4096;
Byte secondByte = myOddUnion.Byte1;

ولكن هذا يساعد حقا إلا إذا كنت تبحث "لإنقاذ" تكلفة بت يتحول من بايت واحد من كلمة واحدة. أنا لم ينظر في SMIL ولدت، لذلك أنا لا أعرف ما إذا كان هذا هو أي أرخص بالمقارنة مع أي حل آخر.

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

وعلى سبيل المثال: افترض أننا نتعامل مع الأعداد الصحيحة غير موقعة، سيكون لدينا

int  binary
0                       00000000
1                       00000001
...  
127                     01111111
128            00000001 10000000
129            00000001 10000001
...
255            00000001 11111111
256            00000010 10000000
...
16383          01111111 11111111
16384 00000001 10000000 10000000 

وهكذا 0-127 اتخاذ 1 بايت و128-16383 يأخذ 2 بايت، الخ ...

لطرق أكثر تعقيدا للقيام بذلك تحقق من هذه الصفحة

وBitConverter.GetBytes سوف تحصل بايت.

و

وBitConverter.ToInt32 سوف تحصل على كثافة 32 نوعا من بايت.

ما عليك القيام به بعض التحول قليلا. انه من الاسهل بكثير إذا كنت تعمل مع HEX، لأن كل عدد (يعني كل رقم، ولكن الرقم هو للقاعدة 10، عرافة بوابة) تمثل أربعة بت.

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