ForHosting KIT · أدوات المطورين

حاسبة إزاحة حقول struct

يشغل char ثم int ثم char مساحة 12 بايت لا 6: تعرض الحاسبة إزاحة كل عضو والحشو الذي يسبقه والحشو في النهاية، بالقواعد نفسها التي يتبعها المُصرّف. مجانية في متصفحك.

  • مجاني
  • يعمل في متصفحك
  • دون تسجيل
  • بياناتك لا تغادر جهازك
استخدمها من الويبAPIالبريدTelegramالتطبيق قريبًا

تضع مُصرّفات C وC++ كل عضو في struct عند إزاحة بالبايت تحترم محاذاته الطبيعية، ثم تضيف حشوًا للنوع كاملًا كي تبقى مصفوفات الـstruct محاذاة. هذا التخطيط هو بالضبط ما تبلّغ عنه الماكرو offsetof والمُعامل sizeof، ومع ذلك فإن عدّ الحشو يدويًا عبر ABI و#pragma pack ما يزال يُحدث أخطاء صامتة في البروتوكولات الثنائية وروابط FFI ومقالب الذاكرة. تقبل حاسبة إزاحة حقول الـstruct قائمة مرتّبة من الحقول بأنواع سلمية معروفة في C أو بحجم ومحاذاة صريحين، وتطبّق قواعد الرفع نفسها التي يستخدمها المُصرّف، وتعيد إزاحة كل حقل والحشو قبله وحجم الـstruct الكلي والمحاذاة العامة والحشو الختامي. قيم pack الاختيارية تمثّل البنى المعبّأة، وabi الاختياري يختار LP64 أو LLP64 أو ILP32 لعرض long والمؤشرات.

كيف يضع C الحقول: المحاذاة والحشو وsizeof

لتسلسل من الأعضاء بترتيب التصريح يحتفظ المُصرّف بمؤشر بايت يبدأ من الصفر. قبل وضع حقل يرفع المؤشر إلى مضاعف المحاذاة الفعلية لذلك الحقل، ويسجّل ذلك العنوان كإزاحة للحقل، ثم يتقدم المؤشر بمقدار حجم الحقل. البايتات المتجاوزة في الرفع تصبح حشوًا قبل العضو ولا تدخل أبدًا في تخزين الحقل ذاته.

بعد آخر عضو قد يُدرج المُصرّف حشوًا ختاميًا ليكون الحجم الكلي مضاعفًا لمحاذاة البنية، وهي أقصى محاذاة فعلية بين كل الأعضاء. ذلك الحجم النهائي هو ما يعيده sizeof، وكل عنوان مسجّل هو ما يعيده offsetof لاسم العضو المقابل. تتبع المحاذاة الطبيعية للسلميات ABI المنصة: في أنظمة LP64 يكون char بايتًا واحدًا بمحاذاة واحد، وshort اثنين، وint أربعة، وlong والمؤشر ثمانية، وfloat أربعة، وdouble ثمانية؛ ويُبقي LLP64 long عند أربعة بينما تبقى المؤشرات ثمانية، ويستخدم ILP32 أربعة لكل من long والمؤشرات.

ترمّز هذه الحاسبة تلك الجداول حتى تستطيعوا تبديل ABI دون إعادة كتابة قوائم الحقول. فهم تلك القفزة هو غاية أداة offsetof: يجب أن تتوافق مقالب الذاكرة وصيغ السلك والروابط المولَّدة مع المُصرّف، لا مع جمع ذهني عابر للأحجام وحدها.

أين تثبت واجهة إزاحة struct قيمتها والتسعير والحدود

يستخدم مبرمجو الأنظمة ومهندسو الهندسة العكسية حاسبة إزاحة حقول struct للتحقق من أن تخطيطًا مكتوبًا يدويًا يطابق المُصرّف قبل شحن محلّل بروتوكول ثنائي أو مقلب بنية نواة. تحتاج مولّدات FFI والروابط أرقام offsetof وsizeof حتمية لـ LP64 مقابل LLP64 في Windows كي يستهدف وصف المخطط نفسه Linux وmacOS وWin64 دون إعادة تصريف برنامج مسبار على كل مضيف. تستفيد مواقع المحتوى التي تتصدر لعبارة حاسبة إزاحة حقول struct من ودجة مجانية حية تطابق وحدتها النقية مسار الأتمتة المدفوع بايتًا ببايت.

فشل التحقق لا يستهلك الرصيد. أبقوا قوائم الحقول ضمن الحد الأقصى المنشور، وفضّلوا الأنواع المسماة لقابلية النقل، وثبّتوا الإزاحات في الاختبارات.

بروتوكولات ثنائية وتحليل المقالب

أكدوا إزاحة كل حقل بالبايت وsizeof الكلي قبل كتابة مُرمّز سلكي أو تفسير مقلب ذاكرة مقابل struct في C.

روابط FFI ومتعددة ABI

ولّدوا أو تحققوا من تخطيطات LP64 وLLP64 وILP32 لنفس قائمة الأعضاء كي تطابق الروابط الأصلية كل نموذج بيانات مستهدف.

كيف أحسب إزاحات حقول struct في C؟

أرسلوا fields كمصفوفة مرتّبة من {name, type} (أو {name, size, alignment}).

هل يطابق هذا الماكرو offsetof؟

نعم للأعضاء السلمية تحت ABI المختار وقيمة pack الاختيارية. تتبع الإزاحات وsizeof قواعد الوضع نفسها التي يستخدمها المُصرّفون للبنى السلمية الطبيعية أو المعبّأة.

ماذا يفعل pack؟

يمثّل pack القيمة #pragma pack(n). احذفوا pack للتخطيط الطبيعي (غير المعبّأ).

ما ABI المدعومة؟

lp64 (الافتراضي: long والمؤشر 8 بايت)، وllp64 (Windows 64 بت: long 4 والمؤشر 8)، وilp32 (long والمؤشر 4).

لماذا يكون sizeof لبنية struct أكبر من مجموع أعضائها؟

لأن المُصرّف يضيف حشوًا. مع char ثم int ثم char تُضاف ثلاثة بايتات قبل int فيبدأ عند الإزاحة 4، وثلاثة أخرى في النهاية ليصبح الحجم الكلي 12 من مضاعفات محاذاة البنية وهي 4.

كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.

POSThttps://api.kit.forhosting.com/dev/struct-field-offset

صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.

curl -X POST https://api.kit.forhosting.com/dev/struct-field-offset \
  -H "Authorization: Bearer $KIT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"fields":[{"name":"a","type":"char"},{"name":"b","type":"int"},{"name":"c","type":"char"}]}'
{
  "fields": [
    {
      "name": "a",
      "type": "char"
    },
    {
      "name": "b",
      "type": "int"
    },
    {
      "name": "c",
      "type": "char"
    }
  ]
}
{
  "task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
  "type": "dev.struct_field_offset",
  "status": "queued",
  "_links": {
    "result": "/tasks/tsk_…/result"
  }
}

الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.

لكل طلب$0.002

السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.

HTTPالرمزالمعنى
401unauthorizedمفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك.
402insufficient_balanceرصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة.
404unknown_typeنوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب.
429rate_limitedتجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة.

يشترك مسار المتصفح المجاني وواجهة API المدفوعة مسبقًا في وحدة تحليلية نقية واحدة، فلا تختلف مفاتيح التمارين عن أوراكل الإنتاج. فشل التحقق يرفع invalid_input ولا يُحاسب.

كيف يضع C الحقول: المحاذاة والحشو وsizeof

عندما لا يحتاج حقلان متجاوران حشوًا تكون قيمة padding_before صفرًا؛ وعندما يلي char قيمة int في التخطيط الطبيعي يظهر ثلاثة بايتات من الحشو قبل int وتقفز الإزاحة من واحد إلى أربعة.

عقد الإدخال والتعبئة وABI وشكل الاستجابة والأخطاء

قد يكون pack الاختياري واحدًا أو اثنين أو أربعة أو ثمانية لنمذجة #pragma pack(n): تصبح المحاذاة الفعلية لكل حقل الحد الأدنى بين محاذاته الطبيعية وpack. احذفوا pack للتخطيط الطبيعي غير المعبّأ. يكون abi الاختياري lp64 افتراضيًا وقد يكون llp64 أو ilp32. يوفّر الأعضاء المعتمة المخصّصة حجمًا صحيحًا موجبًا ومحاذاة بقوة اثنين دون الاعتماد على جدول الأنواع. اقرنوا الإزاحات بمقلبكم أو مولّد الشيفرة؛ لا يُصدر هذا الطرف مصدر C بل أرقام التخطيط التي يقتضيها offsetof وsizeof فقط. أرسلوا جسم JSON بطريقة POST يحتوي fields كمصفوفة غير فارغة من الكائنات، لكل منها name غير فارغ وسلسلة type أو size وalignment بالبايت معًا. تشمل الأنواع المعروفة char وshort وint وlong وlong long وfloat وdouble وbool وعائلة العرض الثابت intN_t وuintN_t وpointer أو size_t للأعداد بحجم العنوان. تُقبل الأسماء البديلة members وlayout للمصفوفة. تفشل المصفوفات الفارغة وأسماء الأنواع المجهولة والمحاذاة غير قوة الاثنين والأسماء الناقصة وقيم pack خارج enum برمز invalid_input. عند النجاح يتضمن الجسم abi وpack اختياريًا عند تفعيل التعبئة وfield_count وfields مع index وname وtype وsize وnatural_alignment وeffective_alignment وoffset وpadding_before وstruct_size وstruct_alignment وtrailing_padding وtotal_padding وused_bytes (مجموع أحجام الأعضاء فقط) وmethod c_struct_offsetof وسلسلة formula قصيرة. مثال: char a وint b وchar c تحت LP64 طبيعي يعطي إزاحات صفر وأربعة وثمانية مع struct_size اثني عشر وثلاثة بايتات حشو داخلي قبل b وثلاثة بايتات ختامية ليكون الحجم مضاعف أربعة.

أين تثبت واجهة إزاحة struct قيمتها والتسعير والحدود

تمنح مختبرات تعليم المحاذاة والتعبئة الطلاب قائمة حقول وإعداد pack؛ ويعلّم أوراكل API نقي الخطأ الشائع بجمع الأحجام دون حشو. تثبّت مجموعات التكامل المستمر struct_size وكل إزاحة كي يفشل الاختبار فورًا عند تغيير مخطط يُدرج حقلًا أو يغيّر أعلام ABI. ولأن التنفيذ parse نقي من المستوى A، تكلف كل مكالمة ناجحة السعر الأساسي المنشور $0.002 دون رموز نموذج ودون شبكة صادرة.

تعليم المحاذاة والتعبئة

اسمحوا للطلاب بمقارنة التخطيط الطبيعي مع #pragma pack ورؤية padding_before وtrailing_padding دون تصريف برامج مسبار.

كم تكلفة حاسبة إزاحة حقول struct؟

أداة المتصفح مجانية. تستخدم طلبات API رصيد KIT المدفوع مسبقًا بسعر $0.002 لكل استدعاء ناجح؛ الإدخال غير الصالح لا يُحاسب.

اطّلع على توثيق KIT الكامل ←