C / C ++ قراءة بايت من hexinput من ستدين
سؤال
لا يمكن العثور بالضبط طريقة حول كيفية القيام بما يلي في C / C ++.
والإدخال: القيم hexdecimal، على سبيل المثال: ffffffffff ...
ولقد حاولت التعليمات البرمجية التالية من أجل قراءة المدخلات:
uint16_t twoBytes;
scanf("%x",&twoBytes);
وولهذا يعمل بشكل جيد وكل شيء، ولكن كيف يمكنني تقسيم 2bytes في القيم 1bytes uint8_t
(أو ربما حتى قراءة البايت الأول فقط). ترغب في قراءة البايت الأول من المدخلات، وتخزينها في مصفوفة بايت في موقف اختيار.
uint8_t matrix[50][50]
وبما أنني لست ماهرة جدا في صيغة / القراءة من الإدخال في C / C ++ (ولقد استخدمت فقط scanf حتى الآن) أي أفكار أخرى حول كيفية القيام بذلك بسهولة (وبسرعة اذا مضت) هو موضع تقدير كبير.
وتحرير: وجدت حتى أفضل طريقة باستخدام الدالة fread لأنه يتيح واحد يحدد عدد بايت يجب أن يقرأ من تيار (ستدين في هذه الحالة)، وحفظ لمتغير / مجموعة
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
ومعلمات
وPTR - مؤشر إلى كتلة من الذاكرة مع الحد الأدنى من حجم (حجم * العد) بايت
وحجم - الحجم بالبايت من كل عنصر يمكن ان تقرأ
والاعتماد - عدد من العناصر، كل واحد مع حجم بايت حجم
وتيار - مؤشر إلى كائن FILE يحدد تيار الإدخال.
المحلول
و%x
يقرأ على unsigned int
، وليس uint16_t
(يعتقد أنها قد تكون هي نفسها على منصة التشغيل الخاصة بك).
لقراءة فقط بايت واحد، حاول هذا:
uint32_t byteTmp;
scanf("%2x", &byteTmp);
uint8_t byte = byteTmp;
وهذا يقرأ على unsigned int
، ولكن توقف بعد قراءة حرفين (حرفين عرافة يساوي ثمانية بت، أو بايت واحد).
نصائح أخرى
ويجب أن تكون قادرة على تقسيم متغير مثل هذا:
uint8_t LowerByte=twoBytes & 256;
uint8_t HigherByte=twoBytes >> 8;
وزوجان من الأفكار:
1) قراءتها على أنها أحرف وتحويلها يدويا - مؤلم
2) إذا كنت تعرف أن هناك من مضاعفات الرقم 4 hexits، يمكنك أن تقرأ فقط في twobytes ومن ثم تحويلها إلى قيم بايت واحد مع twobytes = مرتفع << 8؛ منخفض = twobyets وFF؛
و3)٪ 2X