يك درخواست

ali guard

Member
سلام دوستان من يك سوال داشتم من ميخواهم با ملتى ميديا سايز با hex تبديل كنم
ميسلى اين برنامةى باين ببينيد لطفا كسى يك نمونة دروست بكنت
 

پیوست ها

  • fsc.rar
    4.7 کیلوبایت · بازدیدها: 23

ubuntu

Member
من دقيقاً منظورتون رو متوجه نشدم. ولي اگه منظورتون تبديل عددي به HEX هستش پلاگ اين MathEX مي‌تونه اين کار رو انجام بده. در ضمن اسم تاپيک رو درست انتخاب کنين.:wink:
 

ali guard

Member
من دقيقاً منظورتون رو متوجه نشدم. ولي اگه منظورتون تبديل عددي به hex هستش پلاگ اين mathex مي‌تونه اين کار رو انجام بده. در ضمن اسم تاپيک رو درست انتخاب کنين.:wink:
ممنون از رهنماي شوما براى ان منظورم بفهميد بيهتر بود فايلى بالا دانلود كنيد
 

ubuntu

Member
خوب نتيجه‌اي که من گرفتم اين بود. تقريباً دستور DEG to HEX تو MathEX++ همين کار رو مي‌کرد. با اين تفاوت که تو برنامه ابتدا برعکس ترتيب اعداد داده شده توسط پلاگ‌اين رو نمايش مي‌داد و سپس عدد داده شده رو آخر مي‌زاشت و فاصله‌ي بينش رو با 0 پر مي‌کرد. مثلاً اگه عدد 61945 رو وارد کنين پلاگ‌اين به شما مي‌ده:
F1 F9
ولي نرم‌افزاري که شما گذاشته بودين مي‌داد:
F9 F1 00 00 00 00 F1 F9
 

ali guard

Member
دروست هست ولى من ميخواهم دقيق ميسلى ان برنامة بشة كة فرستادم
اطر يك مسال سراخ درن ممنونم
 

the_king

مدیرکل انجمن
بالاخره فرصت لازم رو پیدا کردم و برنامه نویسی با Multimedia Builder رو یاد گرفتم.
درسته که زبان ماکرویی ضعیفی داره، ولی برای عملیات ساده ای مثل تبدیلات مبنای عددی که نیازی
به پلاگین نیست.

کد Script زیر رو مطابق برنامه نمونه ویژوال بیسیکی که ارائه کرده بودید ساختم، عدد number رو به
دو شیوه Big Endian و Little Endian به معادل مبنای 16 تبدیل کرده و در Label ای با عنوان Hex1 قرار می دهد،
من صرفا بین دو عدد Hex یک خط تیره (کاراکتر -) را اضافه کردم که به سادگی می توان حذف اش کرد :

کد:
n = number
hexchar$ = '0123456789ABCDEF'
bindiv = 268435456
h$ = ''
r$ = ''
For i = 1 To 8
  j = INT(n / bindiv)
  If (j > 15) Then
    j = 15
  End
  n = n - (j * bindiv)
  j = j + 1
  a$ = StrGet(hexchar$, j)
  h$ = h$ + a$
  If (i - 2 * INT(i / 2) = 0) Then
    If (i < 8) Then
      h$ = h$ + ' '
    End
    r$ = b$ + a$ + ' ' + r$
  Else
    b$ = a$
  End
  bindiv = INT(bindiv / 16)
Next i
h$ = r$ + '- ' + h$
DisplayValue("Hex1","h$")

اگر در سطر دوم از آخر $h$ = r$ + '- ' + h را به $h$ = r$ + h تغییر بدهید، دقیقا مطابق با برنامه نمونه می شود.

پروژه mbd بصورت zip شده ضمیمه این پست می باشد.
 

پیوست ها

  • convertor.zip
    1.5 کیلوبایت · بازدیدها: 25

ubuntu

Member
براي کسي که مي‌خواهد از پلاگ‌اين استفاده نکنه اين کد فوق‌العاده هستش. ولي باعث شلوغي مي‌شه. ولي برام جالبه شما همه‌ي عمليات‌هاي رياضي رو بدون پلاگ‌اين کد نويسي مي‌کنين. واقعاً به شما تبريک مي‌گم.:rose::paint:
 

splinter cell

Well-Known Member
با سلام.میشه راجع به ثابت bindiv = 268435456 توضیح بدین؟!و اینکه این دو روش Big Endian و Little Endian که گفتین چیه و فرقشون با هم در چیه؟با تشکر از شما
 

the_king

مدیرکل انجمن
با سلام.میشه راجع به ثابت bindiv = 268435456 توضیح بدین؟

عدد 268435456 یا 16 به توان 7، مضرب رقم هشتم اعداد هگزادسیمال است، یعنی مضرب اولین رقم سمت
چپی که در محاسبات لازم داشتیم. توضیح بیشتر در مورد bindiv رو در پست بعدی خواهم داد.

دو شیوه مشخص برای تفکیک کردن رقم های یک عدد وجود داره، یا باید رقم ها را از سمت راست جدا کنیم و یا
از سمت چپ. مثلا عدد 1234 را در مبنای ده دهی در نظر بگیریم، یا بایستی جدا کردن رقم ها را 1 شروع کنیم
و یا از 4.

شیوه اول، از سمت راست به چپ :
مزیت این روش در اینه که برای هر تعداد رقمی الگوریتم یکسانی داره، یعنی در مورد یک عدد 1 و یک
عدد 1000 رقمی به یک شیوه یکسان قابل استفاده است و تغییری نمی کنه.

مرحله 1) هر بار باقیمانده تقسیم عدد به 10 حساب می کنیم تا اولین رقم سمت راست جدا بشه، مثلا باقیمانده
تقسیم 1234 بر 10 برابر 4 است، چون Multimedia Builder نه عملگر تقسیم صحیح (بدون اعشار) دارد و نه
عملگر باقیمانده، بایستی از تابع INT استفاده کنیم، مثلا کد زیر باقیمانده تقسیم 1234 بر 10 را حساب می کند :
کد:
reminder = 1234 - INT(1234 / 10) * 10

مرحله 2) بایستی آن رقم سمت راست را از عدد کسر کنیم تا برای دریافت رقم بعدی آماده باشد، مثلا 1234
به 123 تبدیل شود. کافیست عدد را بر 10 تقسیم صحیح (بدون اعشار) کنیم، در Multimedia Builder این عمل
معادل است با (INT(1234 / 10

مرحله 3) اگر عدد حاصل صفر شده بود که کار خاتمه یافته، وگرنه دوباره به مرحله 1 بر می گردیم تا رقم های بعدی
را بدست آوریم.

کاربرد این شیوه راست به چپ در مواردی است که طول عدد قابل پیش بینی نیست، مثلا ممکن است عدد
بین 1 الی 6 رقم باشد. الگوریتم مورد اشاره در مورد هر مبانی عددی قابل استفاده است، کافیست بجای 10
مبنای مورد نظر را قرار داد، مثلا 2 (مبانی باینری) یا 16 (مبانی هگزادسیمال)

چون ما در برنامه قبلی اعداد مبنای 16 ای با طول ثابت 8 رقمی ایجاد می کردیم، این روش مطلوب ما نبود و بکار نرفت.

نمونه برنامه ای را ایجاد کردم که قابلیت تبدیل یک عدد از یکی از مبناهای عددی باینری (مبنای 2) ، اوکتال (مبنای 8)
و هگزادسیمال (مبنای 16) به دسیمال (مبنای 10) را دارد.

Preview.gif


کنترلهای RadioButton و تیک صحت درستی و نادرستی عدد وارد شده، از خصوصیات بارز این برنامه است.

پروژه mbd برنامه بصورت zip شده ضمیمه این پست می باشد.
 

پیوست ها

  • todecimal.rar
    7.9 کیلوبایت · بازدیدها: 18
  • todecimal.zip
    7.9 کیلوبایت · بازدیدها: 14
آخرین ویرایش توسط مدیر:

the_king

مدیرکل انجمن
شیوه دوم، از سمت چپ به راست :
مزیت این روش در اینه که صفر های سمت چپ رو بطور ذاتی اضافه می کنه، به همین دلیل برای اعدادی
که قراره طول ثابتی داشته باشند مناسبه.

فرض کنیم که بخواهیم ارقام عدد 1234 را به شیوه دوم یکی یکی جدا کنیم. فرض می کنیم که اعداد ما
همواره 4 رقمی هستند.

مرحله 1) اگر قرار باشه که طول عدد رو m رقمی در نظر بگیریم، مبنای عددی مورد نظر (مثلا 10) را به توان
m - 1 می رسانیم، مثلا اگر قرار است اعداد 4 رقمی را پردازش کنیم، 10 را به توان 3 می رسانیم، یعنی 1000
و نام مقدار حاصل را bindiv می گذاریم.

مرحله 2) هر بار حاصل تقسیم صحیح عدد به bindiv را حساب می کنیم تا اولین رقم سمت چپ جدا بشه،
مثلا باقیمانده تقسیم 1234 بر 1000 برابر 1 است، چون Multimedia Builder عملگر تقسیم صحیح (بدون اعشار) ندارد،
بایستی از تابع INT استفاده کنیم، مثلا کد زیر حاصل تقسیم صحیح 1234 بر 1000 را حساب می کند :
کد:
j = INT(1234 / 1000)

مرحله 3) بایستی آن رقم سمت چپ را از عدد کسر کنیم تا برای دریافت رقم بعدی آماده باشد، مثلا 1234
به 234 تبدیل شود. کافیست باقیمانده تقسیم عدد را بر bindiv را محاسبه کنیم.

مرحله 4) مقدار فعلی bindiv را بر مبنای عدد (مثلا 10) تقسیم می کنیم تا برای محاسبه رقم بعدی آماده باشد.
در مثالی که زدیم، 1000 را بر 10 تقسیم می کنیم تا 100 حاصل شود.

مرحله 5) مجددا از مرحله 1 کار را تکرار می کنیم، این عمل در کل به تعداد m بار (تعداد رقم ها) تکرار می شود
تا در نهایت bindiv به 0 رسیده باشد.

الگوریتم مورد اشاره در مورد هر مبانی عددی قابل استفاده است، کافیست بجای 10 مبنای مورد نظر را قرار داد،
مثلا 2 (مبانی باینری) یا 16 (مبانی هگزادسیمال)

چون ما در برنامه قبلی اعداد مبنای 16 ای با طول ثابت 8 رقمی ایجاد می کردیم، این روش مطلوب ما بود و
بکار برده شد.

نمونه برنامه ای را ایجاد کردم که قابلیت تبدیل یک عدد از مبنای دسیمال (مبنای 10) به یکی از مبناهای عددی
باینری (مبنای 2) ، اوکتال (مبنای 8) و هگزادسیمال (مبنای 16) را دارد.

Preview2.gif


کنترلهای RadioButton و تیک صحت درستی و نادرستی عدد وارد شده، از خصوصیات بارز این برنامه است.

پروژه mbd برنامه بصورت zip شده ضمیمه این پست می باشد.
 

پیوست ها

  • fromdecimal.zip
    8 کیلوبایت · بازدیدها: 16
آخرین ویرایش توسط مدیر:

the_king

مدیرکل انجمن
این دو روش Big Endian و Little Endian که گفتین چیه و فرقشون با هم در چیه؟با تشکر از شما

یک عدد مانند 1234 رو در نظر بگیریم، معادل باینری این عدد 10011010010 است، بدیهی است که چنین عدد
11 بیتی ای در یک بایت (8 بیت) جا نمی شود و بایستی برای ذخیره سازی آن دو بایت را بکار برد. ابتدا به سمت
چپ این عدد 5 بیت 0 اضافه می کنیم تا 16 بیت گردد و بتوان آنرا به دو 8 بیتی شکست.

سپس در هنگام ذخیره سازی این عدد در حافظه آنرا به دو 8 بیتی می شکنیم که این عمل چنین نتیجه ای
خواهد داشت :
کد:
10011010010
= 0000010011010010
= 00000100 + 11010010

تنها مساله ای که باقی می ماند این است که در حافظه ابتدا بایت 11010010 (بایت با ارزش پایین تر) را ذخیره کنیم و
یا 00000100 (بایت با ارزش بالاتر).
فرق دو شیوه Big Endian و Little Endian دقیقا در همین مساله است. در شیوه Little Endian ابتدا بایت های
با ارزش پایین تر ذخیره می شوند و در شیوه Big Endian ابتدا بایت های با ارزش بالاتر.

اکثر پردازنده های متعارف همانند خانواده 8086 کمپانی Intel که در کامپیوتر های PC ازشون استفاده می کنیم،
Little Endian هستند، مثلا اگر بخواهند عدد 56 رو در چهار بایت ذخیره کنند، اول 56 رو در بایت اول ذخیره می کنند
و پشت سرش سه بایت 0 قرار می دهند تا طول عدد چهار بایتی باشد.

بطور خاص پردازنده های Motorola و پردازنده های سری PowerPC که در کامپیوتر های مکینتاش
مورد استفاده قرار می گیرند، Big Endian هستند، مثلا اگر بخواهند عدد 56 رو در چهار بایت ذخیره کنند،
اول سه بایت 0 رو ذخیره می کنند و سپس 56 رو در بایت چهارم ذخیره می کنند.

در برنامه ای که ابتدای گفتگو قرار داشت و حقیر هم بازنویسی کردم، هر دو حالت Little Endian و Big Endian
بصورت چهار بایتی (8 رقم هگزادسیمال) در کنار هم نمایش داده شده بودند. مثلا عدد 5 را هم بصورت
05 00 00 00 (شیوه Little Endian) و هم بصورت 00 00 00 05 (شیوه Big Endian) نمایش داده شده بود :

Preview3.gif


اصولا در مستنداتی که نحوه ذخیره سازی اعداد اهمیت دارد، همانند ساختار درونی فایلها، پاکت بندی اطلاعات
ارسالی در شبکه و ... شیوه بکار رفته ( Little Endian یا Big Endian ) مشخص می گردند.
 

جدیدترین ارسال ها

بالا