تبدیل باینری 32 تایی به کد اسکی

mzarkoob

New Member
سلام
کاری که انجام داده ام به این صورته که در ویژال سی شارپ 32 باتون در یک ردیف قرار داده ام و هر کدام از این باتون ها که زده شده کد کاراکتر معادل اسکی آن در فایلی قرار بگیرد. یعنی تعداد دسته باتون سی و دو تایی در فرمم گذاشتم:
کد:
[TABLE="class: cms_table, width: 500"]
[TR]
[TD][COLOR=#00ff00]1[/COLOR][/TD]
[TD][COLOR=#00ff00]0[/COLOR][/TD]
[TD][COLOR=#00ff00]1[/COLOR][/TD]
[TD][COLOR=#00ff00]1[/COLOR][/TD]
[TD][COLOR=#00ff00]1[/COLOR][/TD]
[TD][COLOR=#00ff00]1[/COLOR][/TD]
[TD][COLOR=#00ff00]1[/COLOR][/TD]
[TD][COLOR=#00ff00]1[/COLOR][/TD]
[TD][B][COLOR=#ff0000]1[/COLOR][/B][/TD]
[TD][B][COLOR=#ff0000]0[/COLOR][/B][/TD]
[TD][B][COLOR=#ff0000]1[/COLOR][/B][/TD]
[TD][B][COLOR=#ff0000]0[/COLOR][/B][/TD]
[TD][B][COLOR=#ff0000]1[/COLOR][/B][/TD]
[TD][B][COLOR=#ff0000]0[/COLOR][/B][/TD]
[TD][B][COLOR=#ff0000]1[/COLOR][/B][/TD]
[TD][B][COLOR=#ff0000]0[/COLOR][/B][/TD]
[TD][COLOR=#ff8c00]0[/COLOR][/TD]
[TD][COLOR=#ff8c00]1[/COLOR][/TD]
[TD][COLOR=#ff8c00]0[/COLOR][/TD]
[TD][COLOR=#ff8c00]1[/COLOR][/TD]
[TD][COLOR=#ff8c00]0[/COLOR][/TD]
[TD][COLOR=#ff8c00]1[/COLOR][/TD]
[TD][COLOR=#ff8c00]0[/COLOR][/TD]
[TD][COLOR=#ff8c00]1[/COLOR][/TD]
[TD][B][COLOR=#a52a2a]1[/COLOR][/B][/TD]
[TD][B][COLOR=#a52a2a]0[/COLOR][/B][/TD]
[TD][B][COLOR=#a52a2a]0[/COLOR][/B][/TD]
[TD][B][COLOR=#a52a2a]0[/COLOR][/B][/TD]
[TD][B][COLOR=#a52a2a]1[/COLOR][/B][/TD]
[TD][B][COLOR=#a52a2a]1[/COLOR][/B][/TD]
[TD][B][COLOR=#a52a2a]0[/COLOR][/B][/TD]
[TD][B][COLOR=#a52a2a]1[/COLOR][/B][/TD]
[/TR]
[TR]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD][/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[/TR]
[TR]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD].[/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD].[/TD]
[/TR]
[/TABLE]
اینها را 8 تا 8 تا قرار دادم تا تفکیکش ساده تر باشه.
که مثلا معادل هگزش بشه : 0xBFAA558D
می خواهم هر کدام را که کلیک کردم(در یک سطر) عدد معادل باینریش را در یک تکس باکس قرار دهم و بتونم ذخیره کنم.
به طوری که وقتی این فایل تکس ذخیره شده را با نرم افزار winhex بازش کردم بتونم همین عدد هگزادسیمال را مشاهده کنم
برنامه را نوشتم و ذخیره کردن در تکس باکس هم انجام میشه و کار هم می کنه. ضمیمه هم کردم
ولی فقط یک باگ دارد!
و اون اینه که در هر بایت(8 بیت) باید یک باتون زده بشه وگرنه چیزی که در 8 بیت بعدی می زنیم هم نمایش داده نمی شود.
مثلا فقط 8 بیت دوم از سطر یک را یکیش را میزنید(ترجیحا کاراکتری که قابل نمایش باشد) و 8 بیت اول را چیزی نمی زنیم، ولی چیزی مشاهده نمی شود تا زمانی که 8 بیت اول از سطر یک یک کدامش را بزنید
یعنی با این اوصاف اگر کد باینری
00000000 00110001
را در باتون ها ایجاد کنیم هیچی نشون نمیده ولی اگه فقط یک باتون از 8 بایت اول بزنیم تازه مقدار کاراکتر 1 که معادل 00110001
می باشد هم نشان هم داده می شود.
یا مثلا
00110001 01001000
که بزنیم این نشان میده
H1

ولی اگه به جای
01001000

صفر باشه
00000000
دیگه
1
هم نشون نمیده!
این بدین معناست که این برنامه قادر نیست مقدار تهی(0) را فایل تکس قرار دهد و بایتی را صفر باقی بگذارد
این باگ را چگونه می توان حل کرد !؟
برنامه قسمت اخر که هر 4 بایت را در تکس بایت قرار می دهد را قرار می دهم :

PHP:
textBox7.Text = string.Format("{0}", Convert.ToChar(tmp & 0x000000ff)) +                            string.Format("{0}", Convert.ToChar((tmp & 0x0000ff00) >> 8)) +                            string.Format("{0}", Convert.ToChar((tmp & 0x00ff0000) >> 16)) +
                            string.Format("{0}", Convert.ToChar((tmp & 0xff000000) >> 24));
سپاس
 

پیوست ها

  • test_behnam.rar
    5.6 کیلوبایت · بازدیدها: 2
آخرین ویرایش:

the_king

مدیرکل انجمن
اساس خود ویندوز مبتنی بر زبان ++C/C است که رشته های string اش Null-terminated هستند، یعنی رشته های string شان به کاراکتر null با کد 0 ختم می شود.
بنابر این در تعاریف رشته های Null-terminated رشته ها فقط یک کاراکتر null دارند که آنهم در انتهای آن است.

این اصل هم برای پردازش رشته ها و هم برای نمایش رشته ها صادق است، هر گاه سعی کنید رشته ای را با روتین های استاندارد ویندوز نمایش دهید که میان اش کاراکتر null ای
وجود داشته باشد، صرفا تا موقعیت آن null رسم خواهد شد. به همین دلیل است که تمامی کنترل های استاندارد ویندوز رشته های string رو رو تا جایی نمایش می دهند که
به کاراکتر null با کد 0 برسند. در پردازش رشته خیلی لطف بکنند آن کاراکتر null را نادیده می گیرند.
خود کاراکتر null را حتی جزئی از مقدار داخل کنترل ثبت نمی کنند. معمولا برای null و سایر کاراکتر های غیر قابل نمایش یک عبارت معادل را نشان می دهند، مثلا 00\ یا 00h یا 0x00 .
 

mzarkoob

New Member
سلام
با تشکر از پاسختان
بله انگار همین طوره
ولی راه حل این مشکل چی هست ؟
مثلا با توسعه این برنامه که چند سطر 32 تایی دیگر به سطر آن اضافه کرده ایم بخواهیم در هر سطر 32 تایی فقط یک باتون بزنیم که معادل اسکی آن بتوانیم در فایلی ذخیره کنیم و بعد بتوانیم با نرم افزار winhex مشاهده کنیم:
01 00 00 00 02 00 00 00 04 00 00 00 08 00 00 00 10 00 00 00 20 00 00 00 40 00 00 00 80 00 00 00
ولی این طوری اصلا نمی تونم تهی ایجاد کنم! و حتما بایستی در جاهایی که 00 می خوام باشه یه عدد باشه تا برنامه کار کنه
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلام
با تشکر از پاسختان
بله انگار همین طوره
ولی راه حل این مشکل چی هست ؟
مثلا با توسعه این برنامه که چند سطر 32 تایی دیگر به سطر آن اضافه کرده ایم بخواهیم در هر سطر 32 تایی فقط یک باتون بزنیم که معادل اسکی آن بتوانیم در فایلی ذخیره کنیم و بعد بتوانیم با نرم افزار winhex مشاهده کنیم:
01 00 00 00 02 00 00 00 04 00 00 00 08 00 00 00 10 00 00 00 20 00 00 00 40 00 00 00 80 00 00 00
ولی این طوری اصلا نمی تونم تهی ایجاد کنم! و حتما بایستی در جاهایی که 00 می خوام باشه یه عدد باشه تا برنامه کار کنه
دو تا مساله جدا هست، یکی نمایش در فرم برنامه است و یکی ذخیره سازی در فایل. مشکل شما در مورد فرم برنامه به اساس ساختار رشته ها بر می گرده،
null رو نمیشه نمایش داد، ظاهری برای نمایش نداره، یک TextBox خالی شبیه یک TextBox با 100 تا کاراکتر null ئه.
اگر null رو نمایش اش می دادید هم کاربر چیزی نمی دید، پس راهی نداره، باید بجایش یک مقدار سمبولیک نشان دهید یا اصلا نادیده بگیریدش.

پس برای مشکل اول، نمایش null در فرم کار خاصی نمیشه انجام داد، یا باید در TextBox اصلا نادیده اش بگیرید و درج اش نکنید و یا بجایش یک مقدار سمبولیک نشان دهید.

اما در مورد مشکل دوم، ذخیره سازی در فایل txt، محدودیت شما مربوط به نوع ذخیره سازی در فایل ئه. اگر ساختار فایل متنی باشه، با null به مشکل بر می خورید،
اما اگر فایل رو باینری مدیریت کنید، هیچگونه محدودیتی در مورد ذخیره سازی کاراکتر null یا بایت صفر نیست. عبارتی که شما داخل فایل ذخیره می کنید شامل کاراکتر های
غیر قابل نمایش و ناسازگار با فرمت رشته ای است، پس برای ذخیره کردن اون مقدار از رشته و مقدار داخل TextBox استفاده نکنید. بجایش یک مقدار DWORD / int32 را ثبت کنید.

فایل های متنی txt اصولا فاقد کاراکتر های غیر قابل نمایشی مثل null هستند. اما اگر فایل txt رو به شیوه باینری مدیریت کنید، می توانید کاراکتر null را داخلش ذخیره کنید.
همچین فایل txt ای بخاطر null هایش برای نمایش در ویرایشگر های متنی مثل Notepad مناسب نیست اما در WinHex همان مقادیر مورد نظر شما قابل مشاهده است.
می توانید از BinaryWriter.Write استفاده کنید.
 

mzarkoob

New Member
بله حرف شما کاملا درست بود و از فایل باینری استفاده کردم و البته مستقیم ذخیره می کردم که تقریبا میشه گفت درست شد.
البته چند مورد کوچک دیگه هست که فعلا دو تاش را مطرح می کنم:
1- برای ساخت عدد که باتون آن زده ایم از شیفت استفاده کرده ام:
PHP:
number |= (1 << bit);
از این 32 باتون همه اش درست کار می کند غیر آخری که می خواهد سی و یکی شیفت بده که در چهار چوب تعریف متغییر تعریف شده نمی گنجه که در ابتدای برنامه تعریف کرده ایم:
PHP:
long number = 0;
در C این مورد را این طور می نوشتیم
PHP:
number |= (1UL << bit);
که به صورت unsigned long میشد. اینجا در سی شارپ چطوریه؟

2- این مورد زیاد مربوط به عنوان این تایپیک نیست ولی همین جا مطرح می کنم: سایز فرم را نمیشه از یه حدی بیشتر گذاشت. می خواهم تعداد زیادی سطر از باتون بچینم بیاد تا پایین. ولی در فرم جا نمی شه. یه نوار لازمه بغل فرم که بشه بالا پایینش کرد. از چه چیزی بایستی استفاده بشود؟
با تشکر
 

the_king

مدیرکل انجمن
بله حرف شما کاملا درست بود و از فایل باینری استفاده کردم و البته مستقیم ذخیره می کردم که تقریبا میشه گفت درست شد.
البته چند مورد کوچک دیگه هست که فعلا دو تاش را مطرح می کنم:
1- برای ساخت عدد که باتون آن زده ایم از شیفت استفاده کرده ام:
PHP:
number |= (1 << bit);
از این 32 باتون همه اش درست کار می کند غیر آخری که می خواهد سی و یکی شیفت بده که در چهار چوب تعریف متغییر تعریف شده نمی گنجه که در ابتدای برنامه تعریف کرده ایم:
PHP:
long number = 0;
در C این مورد را این طور می نوشتیم
PHP:
number |= (1UL << bit);
که به صورت unsigned long میشد. اینجا در سی شارپ چطوریه؟

2- این مورد زیاد مربوط به عنوان این تایپیک نیست ولی همین جا مطرح می کنم: سایز فرم را نمیشه از یه حدی بیشتر گذاشت. می خواهم تعداد زیادی سطر از باتون بچینم بیاد تا پایین. ولی در فرم جا نمی شه. یه نوار لازمه بغل فرم که بشه بالا پایینش کرد. از چه چیزی بایستی استفاده بشود؟
با تشکر

ابتدا این نکته رو در نظر بگیرید که معمولا int و long در ++C / C به ترتیب نوع داده های 16 و 32 بیتی بودند ولی در Net. به ترتیب نوع داده های 32 و 64 بیتی هستند.
اگر قصد ثبت کردن یک عدد 32 بیتی را دارید، برای اعداد علامت دار نوع داده های int / Int32 و برای اعداد فاقد علامت uint / UInt32 کفایت می کنند و long و ulong زیادی بزرگ اند.

کد:
            uint number = 0;
            int bit = 31;
            number |= (1U << bit);

برای سوال دوم تان چیزی که مناسب کاربرد شما است یک لیست باکس اختصاصی است. در عین حال که طول و عرض مشخصی دارد از نظر تعداد سطر محدود نمی شوید
و در ضمن سرعت رسم و کاربری اش به مراتب بهتر از ده ها دکمه مجزا است.
 

mzarkoob

New Member
مورد اول بله حل شد یک l زیادی بود و فقط u خالی باید قرار می دادم!
در مورد این
لیست باکس من یک تستی کردم فقط میشه سطر سطر انتخاب کرد و نمیشه چیزهای داخل سطر را انتخاب کرد! چطوری میشه این همه باتون یا چیزی شبیه اون در آن قرار داد که بتوان هر کدام را انتخاب کرد!؟
 

the_king

مدیرکل انجمن
مورد اول بله حل شد یک l زیادی بود و فقط u خالی باید قرار می دادم!
در مورد این
لیست باکس من یک تستی کردم فقط میشه سطر سطر انتخاب کرد و نمیشه چیزهای داخل سطر را انتخاب کرد! چطوری میشه این همه باتون یا چیزی شبیه اون در آن قرار داد که بتوان هر کدام را انتخاب کرد!؟

به مثال پیوستی مراجعه شود :
مشاهده پیوست ButtonsForDWORD.zip
 

mzarkoob

New Member
خیلی جالب بود
ولی من شی superListBox را در اشیاء سی شارپ 2008 نمی تونم پیدا کنم! این از کجا امده!؟
در این پروژه در تولباکس بالای all windows Forms یه تب دیگه هست که این شی در آن هست ولی در یه پروژه که خود ایجاد می کنیم چنین چیزی نیست:-?
 

the_king

مدیرکل انجمن
خیلی جالب بود
ولی من شی superListBox را در اشیاء سی شارپ 2008 نمی تونم پیدا کنم! این از کجا امده!؟
در این پروژه در تولباکس بالای all windows Forms یه تب دیگه هست که این شی در آن هست ولی در یه پروژه که خود ایجاد می کنیم چنین چیزی نیست:-?

یک کنترل دست ساز ئه، کد SuperListBox همون فایل SuperListBox.cs ئه. در پروژه خودتان که این فایل SuperListBox.cs را کپی کردید اسم namespace داخل کد اش را که
در پروژه من ButtonsForDWORD بود تغییر دهید تا با نام namespace کد های پروژه شما مطابقت داشته باشد.
کد:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace [B][COLOR="#0000FF"]ButtonsForDWORD[/COLOR][/B]
{
    public class SuperListBox : ListBox
    {
 

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

بالا