الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

التمثيل الثنائي لل strings و عملية xor

مغلق
بدأه ITEM_TYPE في 10 أكتوبر 2005 · 8 رد · 1,742 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته....

أعزائي مبرمجي السي...

عندي سؤالين احتاج اجابتهم في مشروع قاعد اشتغل عليه وكلي أمل إني القى الاجابات من عندكم...

الحقيقة اني أبي أعرف كيف أقدر اسوي عملية XOR بين ارقام ثنائيه مخزنه على شكل strings. والسؤال الثاني هو كيف أقدر أحصل على التمثيل الثنائي لأي character في string وتخزينه في string جديد حتى أستطيع تطبيق عملية XOR على هذين strings

مثلاً أبي أحصل على التمثيل الثنائي لحرف A..... قد يكون هذا التمثيل هو 01000001000111101010 بعد كذا راح يكون عندي string آخر في رصه من الارقام الثنائيه الاخرى اللي ابي اسوي له عمليه XOR مع التمثيل الثنائي لحرف A.

أتمنى يكون تسائلي واضح وقدرت أوصل طلبي...

شاكر لكم ومقدر لكم تعاونكم

تقبلوا تحياتي اخوكم ITEM_TYPE

تم تعديل هذه المشاركة بواسطة hasan_aljudy في 10 أكتوبر 2005 في 15:34

#2
اقتباس
كيف أقدر اسوي عملية XOR بين ارقام ثنائيه مخزنه على شكل strings.

هل تقصد character string ام تقصد سلسلة من البتات؟

بالنسبة للتمثيل الثنائي لأي حرف .. لست متأكدا من طلبك, و لكن اذا كانت العملية مقتصرة على عمل xor على الحروف فتستطيع تنفيذها على النوع char مباشرة.

char a = 'b';
char b = 'y';
char c = a ^ b;
#3

الأح حسان...

أشكر لك مرورك وتلطفك بالرد...

الحقيقة ان الـ string الذي سوف أعمل عليه هو عبارة عن مجموعة من الأرقام الثنائية المتراصة مثل أن يكون عندي حرف A فأنا أريد أن أحصل على التمثيل الثنائي للـحرف A ومن ثم تخزين هذا التمثيل الثنائي على شكل string فيكون عندي string جديد مكون من اصفار وواحدات، عندئذ سوف أقوم بتحريك المؤشر و تطبيق عملية XOR على كل رقم ثنائي في الـ string مع رقم ثنائي آخر حصلت عليه من حرف آخر وليكن B عندئذ سوف أحصل على مجموعة جديدة من الأصفار والواحدات هي نتيجة المقارنة XOR بين الأرقام الثنائية التي تمثل حرفي A and B....

أتمنى أن أكون قد أوضحت مرادي وشاكر لك ومقدر مرة اخرى...

أخوك ITEM_TYPE

#4

لست متأكدا من قصدك .. مصطلح الـ string في السي يستخدم للجدلالة الى array of characters

اذا كنت تقصد بالـstring سلسلة من الارقام الثنائية, فإن ذاكرة الكومبيتر هي عبارة عن سلسلة من البتات المتراصة ..

السطر

char x = 'A';

سوف يضع الرقم الثنائي اللذي يمثل الحرف 'A' في الذاكرة و يدعك تتعامل مع هذا المتغير من خلال اسم المعرف x

علامة الـ xor في السي بلص بلص هي ^

اذا اردت عمل xor على كل "بت" في حرف 'A' و 'B' مثلا لا تحتاج الا الى تنفيذ العملية ^ عليهما كما وضحت اعلاه.

char x = 'A' ^ 'B';

هذا سيقوم بعمل xor على كل بت في كل من 'A' و 'B' و يضع النتيجة في المتغير x

عملية الـ xor لا تنفذ على كل بت على حدة, بل تنفذ على البايت بأكمله (طبعا تنفذ على كل بت في البايت) و لكن ما أقصده انك لا تحتاج مؤشر الى كل بت ثم تقوم بتحريك هذا المؤشر بنفسك -- هذه العملية يقوم بها الـ hardware نيابة عنك .. بل إني حسب ما اعتقد انه لا توجد طريقة مباشرة للحصول على مؤشر الى "بت" معين في الذاكرة. وإذا اراد المبرمج ان يتلاعب ببتات معينة فإنه سيقوم بعمليات or و and و xor او ما شابه ..

مثلا اذا اردت ان تحول خامس بت في اي رقم في الذاكرة الى "1" فإنك تقوم بعملية or مع الرقم الثنائي

00001000

و اللذي حسب ما اعتقد هوالرقم 8 بالنظام العشري (او 16 .. حسب هل النظام big-endian او little-endian)

الخلاصة انك لا تحتاج (ولا تستطع) تحريك مؤشر على كل بت و تطبيق عملية xor

#5

بالاضافة إلي عملية المكمل الثنائي ~

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح

#6

شرح الأخ hasan_aljudy مفصل وكافي جدا

فقط لي تعليق بسيط

يتم تمثيل البيانات في الذاكره بصوره Binary , ولكن عند عرض البيانات يتم تشكيلها حسب الطلب فمثلا يمكن أن تعرض بشكل Hex بتجميع كل 4 bit وتمثيل قيمتهم من 0 الى f

ويمكن أن تعرض على شكل Ascii Char يتجميع 8 bit لتمثيل byte وتمثيل قيمته حسب جدول الـ Ascii

ويمكن تمثيلها على أي صوره اخرى بالتحويل الى هذه الصوره وتمثيلها بطريقتها

لكن كل العمليات التي تجري على البيانات في الذاكره فهي تجري على بيانات Binary في مجموعات سواء كانت 8 Bit او 16 bit أو 32 bit

كل العمليات الرياضيه والمنطقيه تتم على البيانات بصوره Binary

#7

أعتقد أن الأخ يقصد التالي..

إذا كان لدينا string A تحتوي على القيمة "0101" وهي عبارة عن تمثيل رقمي لعدد ثنائي هو 0101 = 5

وكان ليدنا string B تحتوي على القيمة "1000" وهي عبارة عن تمثيل رقمي للعدد الثنائي هو 1000 = 8

الأخ يريد كود من أجل تحويل string A من صيغتها إلى int أو ماشابه وكذلك string B إلى int أو ماشابه ومن ثم عمل xor بين القيمتين ومن ثم انتاج string C تمثل هذه القيمة بصيغة حرفية ..

المهم إذا هذا ماتريد فعله ، فهذه الطريقة ليست مثلى لعدد اسباب ..

1- قد تكون السلسلة الحرفية جدا طويل أكثر من 32 رقم ثنائي أو اكثر من 64 رقم ثنائي وبالتالي تحتاج إلى مصفوفة من byte لاحتوائهما

2- لماذا اللف والدوران وتحويل ثم تحويل .. الطريقة بطيئة ..!!

لو فكرت فيها قليلا لوجدت أنه يمكن عمل xor بين string A و strng B مباشرة من غير تحويل ثم تحويل .. لاحظ التالي:

الرقم '1' قيمته بالASCII تساوي 0x31

الرقم '0' قيمته بال ASCII تساوي 0x30

إذا حاولنا أن نطبق العملية XOR مباشرة على هذين القيمتين بال ASCII لاحظ أن أعلى 4 بتات متساوبية وبالتالي نتيجة ال XOR تكون 0 دائما في أعلى 4 بتات .. أما أسفل 4 بتات فسوف تكون حصيلة فعلية لتطبيق ال XOR بين العددين أكانا 0 و 1 أو 1 و 0 أو 0 و 0 .....

مثلا :

0x31 ^ 0x30 == 0x01

إذا أردنا ارجاع القيمة 0x01 إلى مقابلها الحرف '1' بال ASCII ماعليك سوى جمع العدد 0x30 معه.. طبعا يمكن استبدال الجمع هنا بالمعامل OR ..

أي بالمختصر إذا أردت أن تعمل XOR بين قيمتين ثنائتين في strings عليك أن تمر على كل حرف في السلسلة وتطبق التالي:

resultChar = A ^ B | 0x30

هذا الكود:

void XorStrings(char* A, char* B, char* result) {
   char *t;

   // Argument validation
   if (!A || !B || !result) return;   // or throw an exception

   // Main loop that XOR's the two strings until any one ends
   while (*A && *B) {
      *result = (*A ^ *B) | '0';
      result++; A++; B++;
   }

   // Copy the remaining of the other string to result
   t = *A ? A : B;
   while (*t) {
      *result++ = *t++;
   }

   // Terminate the result
   *result = '\0';
}

Coding on the Cloud and for the Cloud!

My Blog

#8

السلام عليكم...

الحقيقة أشكر الأخوان حسان واحمد صالح و Asm4all وهاني الاتاسي على جهودهم التي بذلوها معي مقدرا وشاكرا ذلك...

الحقيقة اني أحتاج أن أخزن التمثيل الثنائي لكل حرف على شكل string او array of characters المهم أن أحصل على مجموعة من الأرقام الثنائية التي تمثل character معين حتى يمكنني التعامل معه واجراء عملية XOR مع مجموعة أخرى من الأرقام الثنائية أو مع حرف آخر حصلت على تمثيله الثنائي أيضاً... الغرض من هذا الإجراء هو كتابة برنامج خاص بالتشفير باستخدام الأرقام الثنائية فبالتالي سوف أقوم بعمل عملية XOR مع key مكون من أرقام ثنائيه والناتج سوف يكون تمثيل ينائي آخر سوف أقوم بأخذ قيمته وجعله character آخر حتى تختفي معالم الرسالة... سوف أطرح مثال على ذلك:

مثلا عندي الرسالة التالية: test والـ key هو0011

اولا سوف احصل على التمثيل الثنائي لحرف t ومن ثم أقوم بعمل XOR مع الـkey بعد أن أقوم بتكراره 8 مرات حتى يكون نفس طول التمثيل الثنائي لحرف t واجري عملية XORقد يكون الناتج 01000110101100010010101010001001 وطوله 32 بت ويمثل character آخر وليكن b

نفس الاجراء سوف اقوم بعمله مع الحرف e والذي قد يكون ناتج العملية m

وايضا مع s والذي يكون يكون ناتج العملية /

ومع الحرف t مره أخرى ويعطيني b

عندئذ سوف تكون الرسالة المشفرة هي bm/b

ولفك فك الشفرة نستعمل نفس الاسلوب بالعكس...

أتمنى أن أكون قد وضحت أكثر واعذروني ان كان هناك غموض كبير في تساؤلي الأول أو إن كان هناك بعض الحقائق التي لم أذكرها وشاكرا لكم تعاونكم

أخوكم ITEM_TYPE

#9

الأخوة شرحو لك كيف يمكن عمل هذا .. راجع الأجوبة السابقة واكتب منها الكود ..

Coding on the Cloud and for the Cloud!

My Blog

هذا الموضوع مغلق.

مواضيع مشابهة