أرشيف

Posts Tagged ‘C’

الفرق بين char و unsigned char في لغة C

السلام عليكم و رحمة الله
صادفت في قرائتي لهذه الشفرة التعليق التالي:

/*
 * Encrypt *len bytes of data
 * All data going in & out is considered binary (unsigned char[])
 */

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

“There’s no dedicated “character type” in C language. char is an integer type, same (in that regard) as int, short and other integer types. char just happens to be the smallest integer type. So, just like any other integer type, it can be signed or unsigned.
It is true that (as the name suggests) char is mostly intended to be used to represent characters. But characters in C are represented by their integer “codes”, so there’s nothing unusual in the fact that an integer type char is used to serve that purpose.”

خلاصة القول أنه لا يوجد نوع بيانات خاص يمثل الحروف كما كنا نعتقد في C، بل إن النوع char هو في الأصل نوع ينتمي للأعداد الصحيحة. و الحروف في لغة C تمثل بأرقام ASCI و النوع char صادف أنه أصغر نوع من ناحية الحجم في الذاكرة.
تعليق آخر:

“ You should use unsigned char. The C99 standard says that unsigned char is the only type guaranteed to be dense (no padding bits), and also defines that you may copy any object (except bitfields) exactly by copying it into an unsigned char array, which is the object representation in bytes.
The sensible interepretation of this is to me, that if you use a pointer to access an object as bytes, you should use unsigned char.”

قبل أن نشرح التعليق علينا أولا أن نتذكر كيف يتم تمثيل البيانات في المتغيرات، لنفرض أنه لدينا متغير من نوع int ذو حجم 4 بايت أي 4 * 8 بت:

int num = 457;

المتغير num سيكون كالآتي في الذاكرة:

00000000 00000000 00000000 00000000 

أما تمثيل الرقم 457 سيكون كالآتي:

 00000000 00000000 00000001 11001001

أحيانا يتم عمل padding أو ما يعرف ب “ملئ الباقي” أي أنه البايتات الباقية يتم إضافة لها 0، أكيد في حالة الأرقام هذا لا يضر لأن الصفر من جهة اليسار يلغى كمثالنا السابق لكن في حالة البيانات الثنائية و خاصة إن كنا سنكتب في ملف فإن هذا سيشكل فرق، هنا نرجع إلى ترجمة التعليق السابق الذي يقول فيه أن لغة C تضمن لك أنه لن يتم تطبيق أي padding أو ملئ البايتات الباقية في حالة متغير من نوع unsigned char.

Advertisements
التصنيفات :برمجة الوسوم:

جلب معلومات عن بطاقات الشبكة المتوفرة في جهازك بالسي، الجزء الثاني FreeBSD

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

في المرة السابقة رأينا كيف نقول بجلب قائمة ببطاقات الشبكة المتوفرة في Linux، هذه المرة سنقوم بنفس العمل في FreeBSD حيث أن الإختلاف ليس كبير سوى في ال struct ifaddrs تختلف فيه بعض عناصره في التسمية، يكون struct ifaddrs في FreeBSD كالتالي:

قراءة المزيد…

التصنيفات :أنظمة يونكس الوسوم:, , , ,

جلب معلومات عن بطاقات الشبكة المتوفرة في جهازك بالسي، الجزء الأول Linux

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

اليوم سنتحدث عن طريقة جلب قائمة لبطاقات الشبكة المتوفرة في الجهاز، عادة نكون نملك واحدة فقط لكن بالنسبة لمن لديهم خادم في المنزل أو في العمل فسيكون هناك على الأقل بطاقتين، ما يهمنا من جلب العلومات هنا هو معرفة رقم الأيبي للبطاقة و كذا العنوان الفيزيائي(MAC Address) بالإضافة إن كانت البطاقة تعمل(up) أو ليست في حالة عمل(down) و ليست معطلة :D.

تحتفظ النواة بسلسلة مترابطة(linked list) على مستوى الذاكرة لجميع معلومات بطاقات الشبكة المتوفرة على الجهاز، كل عقدة في هذه السلسلة تحتوي على struct ifaddrs يحوي جميع معلومات بطاقة الشبكة، شكله العام كالتالي:

قراءة المزيد…

التصنيفات :برمجة الوسوم:, ,

باب الإنضمام للمدنة مفتوح

السلام عليكم و رحمة الله و بركاته
بما أن مدونة سيف التقنية هي ملككم فقد إرتأيت أنه من الأفضل فتح باب المساهمة للجميع، الشروط بسيطة كالآتي:
1 _ الكتابة باللغة العربية الفصحى.
2 _ الكتابة بلغة بسيطة، تقنية حيث يمكن كتابة المصطلحات بالإنجليزية إن لم تتوفر لها مرادفات بالعربية.
3 _ المواضيع التي يمكن الكتابة فيها:
4 _ كل مايخص FreeBSD و أنظمة unix-like سواء أكان شرحا، خبرا أو حلا لمشكلة ما.
5 _ الويب بما فيه PHP, JS. أو حتى jQuery.
6 _ دروس في لغة سي.
7 _ ما يفضل ألا تكتبه:
قراءة المزيد…

التصنيفات :عام الوسوم:, , , ,

مكتبة لتقسيم الملفات بإستخدام C

السلام عليكم و رحمة الله و بركاته
منذ يومين قمت بكتابة مكتبة لتقسيم الملفات، المكتبة تعمل في كل الأنظمة الله أعلم (الحقيقة أني لم أجرب بعد:D)، أعلموني إن كان هناك مشكل، المهم أنها تعمل في أنظمة unix like.
رابط المشروع:libSPLT

قراءة المزيد…

التصنيفات :مشاريع, برمجة الوسوم:, , , , ,

كيف تجعل لبرنامجك وسائط

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

عادة في البرامج التي تعمل من سطر الأوامر تكون خياراتها عبارة عن وسائط تمرر من طرف المستخدم مع البرنامج كالآتي :

ls -l -h

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

أبسط برنامج يكون في C كالآتي :

#include<stdio.h>

int main(int argc ,char *argv[])

{

return 0;

}

هذا من Ansi C يمكن إستبدال []argv* ب **argv لآن كلاهما نفس المعنى أي مصفوفة مؤشر .

argc تعني عدد الوسائط أما argv فهي مؤشر للوسائط ،مثلا لو كان برنامجنا كهذا :

pro arg1 arg2 arg3

سيكون argc يبدء من 0 وينتهي عند NULL أم argv فستحمل أولا إسم البرنامج بعدها الوسائط كالآتي :

argv0[pro]

argv1[arg1]

argv2[arg2]

argv3[arg3]

مثال :

#include<stdio.g>

int main(int argc ,char **argv)

{

int i;

for(i=0;i<argc;++i)

printf(“arg[%d] = %s\n”,i,argv[i]);

return 0;

}

نقوم بترجمته بإستخدام GCC :

gcc cl.c -o cl

الآن نشغله :

./cl arg1 arg2 arg3

النتيجة ستكون :

arg[0] = ./cl

arg[1] = arg1

arg[2] = arg2

arg[3] = arg3

في هذا السطر :

for(i=0;i<argc;++i)

أخذنا عدد الوسائط من argc ووضعناه في المتغير I حتى نستخدمه في الوصول إلى عناصر مصفوفة argv التي تحتوي مؤشرا لكل وسيط مررناه .

printf(“arg[%d] = %s\n”,i,argv[i]);

هنا إستخدمنا المتغير I في الوصول إلى عناصر المصفوفة .

مثال بإستخدام الؤشرات :

#include<stdio.h>

int main(int argc ,char **argv)

{

while(argc–)

printf(“%s “,*argv++);

return 0;

}

argc يبدأ من 0 لهذا سيتوقف أوتوماتيكيا عندما يصل إليه ،آخر عنصر في argv هو NULL .

مصادر :

man page : getopt

Arguments to main

command line parsing

مكتبات :

The Argtable

ANSI C Command Line Option Parsing Library

CCmdLine – command line parser

Cross-platform command line argument and option parsing

Anyoption – C/C++ Command line and resource file option parsing

الدرس على شكل ملف : كيف تجعل لبرنامجك وسائط

التصنيفات :برمجة الوسوم:

كيف تحسب عدد أحرف كلمة في ال C

السلام عليكم و رحمة الله و بركاته
اليوم إن شاء الله سنتعرف على طريقة حساب عدد حروف كلمة في لغة C في الحقيقة توجد دالة بإسم strlen في المكتبة string مهمتها حساب عدد حروف كلمة ما
لكن الهدف هنا هو تعلم طريقة بناء مثل هذه الدوال .

قراءة المزيد…

التصنيفات :برمجة الوسوم: