PDA

View Full Version : قرار دادن بایت های پرارزش و کم ارزش در کاراکتر



HAIdle
پنج شنبه 25 مرداد 1386, 14:43 عصر
سلام دوستان
من یه عدد صحیح دوبایتی بدون علامت(UInt16) دارم. می خواهم دو بایت پرارزش و کم ارزش آن را جدا کنم و هر کدام را در یک کاراکتر(char) قرار دهم. لطفا راهنمایی کنید.

PC2st
پنج شنبه 25 مرداد 1386, 15:33 عصر
فکر کنم باید از اشاره گرها استفاده بشه:


static unsafe void Main(string[] args)
{
ushort wow = 3267;
byte* btt = (byte*)&wow;
Console.WriteLine(" Your number is: {0}\t{0:X}", wow);
Console.WriteLine("\n Low Price Byte: {0}\t{0:X}\nHigh Price Byte: {1}\t{1:X}", (byte)*btt++, (byte)*btt);
Console.ReadLine();
}

کد فوق متد Main در حالت کنسول است، که برای اجرای آن باید برنامه را درحالت Unsafe Mode کامپایل کنید.

HAIdle
پنج شنبه 25 مرداد 1386, 15:50 عصر
متشکرم
چه جوری میشه یه کد را در حالت unsafe کمپایل کرد؟ در اینصورت فایل اجریی قابل استفاده هست؟
آیا راه راحت تری وجود نداره؟ مثلا یه تابع آماده ؟

PC2st
پنج شنبه 25 مرداد 1386, 16:13 عصر
راستی در کد قبل، متغیر wow را از نوع uint تعریف کرده بودم، ولی باید از نوع ushort استفاده میکردم. چون شما گفته بودید که UInt16 و من هم به دو بایت جداش کرده بودم، پس باید بجای uint از ushort استفاده میکردم...


آیا راه راحت تری وجود نداره؟ مثلا یه تابع آماده ؟
دقیقا نمیدونم!

برای کامپایل کردن بصورت Unsafe Mode به تصاویری که ضمیمه کردم نگاه کنید... (3 مستطیل قرمز رنگ)

PC2st
پنج شنبه 25 مرداد 1386, 16:27 عصر
البته یه چیزی، برای دسترسی به بایت کم ارزش، میتونید از یک تبدیل نوع استفاده کنید، مثلا:


ushort wow = 3267;
byte bbb = (byte)wow;

HAIdle
پنج شنبه 25 مرداد 1386, 16:33 عصر
بسیار ممنون
میشه در مورد کد unsafe کمی توضیح بدید؟
همین طور در مورد تابع static ؟

PC2st
پنج شنبه 25 مرداد 1386, 17:37 عصر
در مورد کلاسها آشنائی دارید، قبل از استفاده از کلاسها، باید یک شیئ از روی آنها ساخته بشه، مثلا کلاس H رو در نظر بگیرید که به شکل زیر تعریف شده است:


class H
{
private string myVAR;

public H(string data)
{
this.myVAR = data;
}

public void A()
{
MessageBox.Show(this.myVAR);
}

public static void B()
{
Console.Beep();
}
}

که این کلاس دو متد داره، متد A و متد B که متد B بصورت static اعلان شده است.

مثلا دو نمونه از کلاس H را ایجاد میکنیم (اشیاء h1 و h2):


H h1 = new H("Vahid");
H h2 = new H("Ali");
h1.A();
h2.A();

همانطور که میبینید، دستور ناشی از متد A دارای دو نتیجه متفاوت است، زیرا یکی از این متدها جزء شیئ h1 و متد دیگر جزء شیئ h2 هستند و نام هردوی این متدها، A است.
همچنین میبینیم که متد B نه در شیئ h1 وجود دارد و نه در شیئ h2 ...! در واقع متد B یک متد استاتیک است و این متد نمیتواند جزء اشیائی باشد که از روی کلاس H ساخته شده اند و شیئی که متد B در آن قرار دارد یک شیئ کاملا یگانه است که هیچگاه نمیتوان نمونه ای از روی آن ساخت. برای دسترسی به شیئی که متد B در آن قرار دارد، به شکل زیر عمل میکنیم:


H.B();

که در صورت استفاده از کد فوق، یک بوق شنیده خواهد شد.
وقتی که یک عضو مثلا متد B بصورت static باشد، از کلمه کلیدی this نمیتوان در کدهای آن متد استفاده کرد.
هر وقت از کلمه کلیدی new برای ایجاد یک نمونه از کلاس H اقدام کنیم، متد B در آن نمونه جدید (که با دستور new ایجاد شده) قرار نمیگیرد، چون متد B متعلق به خود نوع کلاس خواهد بود و متلق به اشیاء نمونه سازی شده از روی کلاس نیست.

متد Main متدی است که نقطه ی شروع برای برنامه های نوشته شده به زبان سی شارپ به حساب می آید و قطعا این متد باید static باشد.

نمیدونم توضیحاتم تا چه حد دقیق و فاقد از اشتباه بود، بهرحال در مورد کد unsafe، باید گفت که این کدها، کدهائی هستند که امکان استفاده نادرست از آنها وجود دارد، پس نا امن به حساب می آیند. در سی شارپ استفاده از اشاره گرها تنها در قالب کدها unsafe امکان پذیر است. اگر در مورد اشاره گرها مطالب کوچکی احتیاج بود، به وبلاگم یک سر بزنید (لینکش در امضایم هست).