اطلاعیه

Collapse
No announcement yet.

تبدیل 4 بایت به یک int در C

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    تبدیل 4 بایت به یک int در C

    سلام

    من میخواستم یک تابع بنویسم که 4 تغییر که محتویاتشون مثل زیر هست رو به یک int تبدیل کنه که مقدارش مثل زیر باشه:

    char a='0'

    char b='a'

    char c='9'

    char d='F'

    جواب هم داخل متغییر زیر قرار بگیره:

    int i=0x0a9f

    دوستان میتونن کمک کنند چطور این کار رو انجام بدم؟

    ممنون از لطف همه

    #2
    پاسخ : تبدیل 4 بایت به یک int در C

    سلام
    اولا به نظرم تا آنجایی که ذهنم یاری می کنه int در avr به صورت 16 بیتی می باشد و 32 بیتی نمی باشد اما در کامپایلرهای arm به صورت 32 بیتی می باشد. حالا با فرض 32 بیتی بودن می توانی از برنامه زیر استفاده کنید.

    کد:
    i = (a|b<<8|c<<16|d<<24);

    دیدگاه


      #3
      پاسخ : تبدیل 4 بایت به یک int در C

      یک راه راحتش اینه که این کاراکتر ها رو داخل یک رشته قرار بدین و از تابع strtol استفاده کنین:


      char *chk;
      int i = (int)strtol("0a9F", &chk, 16);

      دیدگاه


        #4
        پاسخ : تبدیل 4 بایت به یک int در C

        نوشته اصلی توسط حامد مهری
        سلام

        من میخواستم یک تابع بنویسم که 4 تغییر که محتویاتشون مثل زیر هست رو به یک int تبدیل کنه که مقدارش مثل زیر باشه:

        char a='0'

        char b='a'

        char c='9'

        char d='F'

        جواب هم داخل متغییر زیر قرار بگیره:

        int i=0x0a9f

        دوستان میتونن کمک کنند چطور این کار رو انجام بدم؟

        ممنون از لطف همه
        نوشته اصلی توسط حامد AT91
        سلام
        اولا به نظرم تا آنجایی که ذهنم یاری می کنه int در avr به صورت 16 بیتی می باشد و 32 بیتی نمی باشد اما در کامپایلرهای arm به صورت 32 بیتی می باشد. حالا با فرض 32 بیتی بودن می توانی از برنامه زیر استفاده کنید.

        کد:
        i = (a|b<<8|c<<16|d<<24);
        نوشته اصلی توسط reza_agha
        یک راه راحتش اینه که این کاراکتر ها رو داخل یک رشته قرار بدین و از تابع strtol استفاده کنین:


        char *chk;
        int i = (int)strtol("0a9F", &chk, 16);

        با سلام
        من هم از روش ذیل استفاده می کنم.( در مقایسه اجرایی :سریعترین اجرا را دارد ).
        ابتدا یک union به صورت ذیل تعریف می کنم.

        union i32_ch4 {
        long int l4ch ;
        char ch[4] ;
        } ;
        سپس یک متغیر از نوع همان یونیون

        union i32_ch4 intch ;
        // تعریف متغیر

        intch.ch[0] = highestvalue ;
        // با ارزشترین بایت از 4 بایت

        intch[1] = highervalue ;
        intch[2] = mediumvalue ;
        intch[3] = lowestvalue ;
        // کم ارزشترین بایت از 4 بایت

        my_32bit_int_value = intch.l4ch ;
        // نتیجه 32 بیتی

        با سپاس

        پ.ن:
        اگر کسی می داند چگونه در این ادیتور ، درست بتوانیم انگلیسی تایپ کنیم، متون کدها اینقدر درهم برهم نمی شود.

        پ.ن:2
        با تشکر از آقا رضا ، بر اساس پست ایشان که بعد از این پست ملاحظه می فرمایید، باید به bigendian یا littleendian
        ( بایت با ارزشتر یک عدد 4 بایتی ، اول ذخیره می شود ، یا آخر ) توجه کنیم.
        من در keil 8051 و کدویژن atmega , نیز keil-ARM نتایج یکسان دریافت کردم،

        گشتی در لاله زار
        http://www.eca.ir/forum2/index.php?topic=76138.0

        http://www.eca.ir/forum2/index.php?topic=76141

        دیدگاه


          #5
          پاسخ : تبدیل 4 بایت به یک int در C

          جنابSolsal!
          بهتره که متن انگلیسیتونو توی notepad تایپ کنین و اول و آخرش یک تگ "چپ براست" بذارین. فکر میکنم آقای اکرمی یکبار این توضیح رو داده باشن.

          مثلا:


          union i32_ch4
          {
          long l4ch;
          char ch[4];
          };


          ضمنا جناب Solsal (متاسفانه نمیدونم فارسی اش چی میشه) کاراکتر '0' با مقدار عددی صفر فرق میکنه. و به ازای این ترکیب باید هر کاراکتر رو بعد از تبدیل داخل بایت مربوطه بذارین. ضمنا در این مورد بخصوص که قید فرمودین دیگه سورس تون portable نمیشه. چون با یک endianness بخصوص کار کردین.

          اینم محض گیر دادن بیخودی بود و هیچ دلیل دیگه ای نداشت!!

          دیدگاه

          لطفا صبر کنید...
          X