PDA

View Full Version : سوال: تبدیل عدد دیسمال به باینری سه بایته



abasfar
شنبه 07 اسفند 1389, 12:53 عصر
سلام
مشکل من این است که وقتی عدد را به مبدل خودم میدم میتونم 2بایتی و4 بایتی بدست بیارم اما 3 بایته نه
کد من



public byte[] FromNumberToByte(int num,int bytes)
{
if (bytes == 2)
return BitConverter.GetBytes(Convert.ToInt16(num));
if (bytes == 4)
return BitConverter.GetBytes(Convert.ToInt32(num));
return BitConverter.GetBytes(num);
}

mehdi.mousavi
شنبه 07 اسفند 1389, 15:08 عصر
سلام مشکل من این است که وقتی عدد را به مبدل خودم میدم میتونم 2بایتی و4 بایتی بدست بیارم اما 3 بایته نه

سلام.
کاملا طبیعی هستش، تابع GetBytes بر اساس Data Type ورودی خودش، به شما یک آرایه به طول 2، 4 یا 8 ممکنه برگردونده (به ترتیب برای int32، int16 و int64).
میشه بفرمایید هدفتون از این کار چیه؟ اگر اصل مساله رو توضیح بدید شاید راه حل مناسبتری بهتون ارائه کنم.

موفق باشید.

abasfar
شنبه 07 اسفند 1389, 15:58 عصر
ممنون از جواب شما
من میخوام رایت عکس مانند bmp ودر هر پیکسل rgb سه بایته که من میخوام عدد را به صورت دهی بدم وتابع به 3بایت تبدیل کنه وبایت را تحویل بده

mehdi.mousavi
شنبه 07 اسفند 1389, 16:09 عصر
ممنون از جواب شما من میخوام رایت عکس مانند bmp ودر هر پیکسل rgb سه بایته که من میخوام عدد را به صورت دهی بدم وتابع به 3بایت تبدیل کنه وبایت را تحویل بده

سلام.
برای اینکار می تونید از Color.FromArgb استفاده کنید.
Integer مورد نظر رو بهش بدید، و RGB رو در Property های مختلف ازش دریافت کنید.

موفق باشید.

abasfar
شنبه 07 اسفند 1389, 16:46 عصر
ممنون از جواب شما
اما ببینید من میخوام بگم مثلا نقطه 25و25 قرمز باشه خوب من دیگه نمیخوام بنویسم مثلا ارایه اولی Color.FromArgb(X).R
بعد ارایه بعدی Color.FromArgb(X).G
,وبعدی Color.FromArgb(X).B
من یکجا خودش مقدار بگیره و سه بایت را مقدار بده
وراستی فکر کنم این تابع با فرمت ما کمی متفاوت است
rgb
255.255.255
ما با این فرمت در نظر میگیریم اما اون برای هرکدام ازرنگها یک شماره در نظر میگیره

mehdi.mousavi
شنبه 07 اسفند 1389, 17:24 عصر
ممنون از جواب شما
اما ببینید من میخوام بگم مثلا نقطه 25و25 قرمز باشه خوب من دیگه نمیخوام بنویسم مثلا ارایه اولی Color.FromArgb(X).R
بعد ارایه بعدی Color.FromArgb(X).G
,وبعدی Color.FromArgb(X).B
من یکجا خودش مقدار بگیره و سه بایت را مقدار بده
وراستی فکر کنم این تابع با فرمت ما کمی متفاوت است
rgb
255.255.255
ما با این فرمت در نظر میگیریم اما اون برای هرکدام ازرنگها یک شماره در نظر میگیره

سلام.
اگر چه با همون Color.FromArgb میتونید به هدفتون برسید، (همینطور با Shift دادن اعداد و ...)
اما خوب، یه روش دیگه استفاده از چیزی شبیه union ها در C++ هستش. ابتدا در برنامه خودتون،
یک Structure بدین شکل تعریف کنید:


[StructLayout(LayoutKind.Explicit)]
struct RGB
{
[FieldOffset(0)]
public byte R;

[FieldOffset(1)]
public byte G;

[FieldOffset(2)]
public byte B;

[FieldOffset(0)]
public int value;
};


حالا برای استفاده، می تونیم به این شکل عمل کنیم:


RGB color = new RGB();
color.value = 6604840;اینجا، من از روی Integer ام (که 6604840 باشه)، value ی structure ام رو set میکنم. حالا خط بعدی، اگر بنویسید color.R مقدار 40، color.G مقدار 200 و color.B مقدار 100 رو میگیرید... (همون سه بایتی که دنبالش بودید). یا برعکس، اگر اون سه بایت رو داشته باشید، می تونید بدین شکل به اون Integer برسید:



RGB color = new RGB();
color.R = 40;
color.G = 200;
color.B = 100;
خط بعد اگر color.value رو ببینید، مقدار 6604840 هستش... یعنی به سادگی با تعیین Layout هر فیلد، می تونید مشکلتون رو رفع کنید.

موفق باشید.