PDA

View Full Version : مشکل در تبدیل قسمتی از آرایه ای از byte به int



mandagarana
چهارشنبه 04 اردیبهشت 1398, 16:29 عصر
با سلام
من یک برنامه کوچیک نوشتن جهت تبدیل []byte به float .یک تابع که خودم نوشتم و یک تابه که مال خود #C هستش.
مسئله اینجاست وقتی از اول آرایه تبدیل میکنم درسته هر دوتا ولی وقتی از وسط برمیدارم فقط تابع خودم کار میکنه.و تابع خود #C خطا میده.از اونجا که تابع خودم unsafe هستش نمیخام استفاده کنم.


static void Main(string[] args) {


byte[] d = new byte[24];


d[0] = 0xF0;
d[1] = 0x49;
d[2] = 0x02;
d[3] = 0x00; //150000






d[4] = 0xE3;
d[5] = 0x07;//2019






byte[] r = new byte[2];


r[0] = d[4];
r[1] = d[5];



var f1 = BitConverter.ToSingle(r, 0);


float f2 = ToFloat(r, 0);


Console.WriteLine(f1);
Console.WriteLine(f2);
Console.ReadKey();


}


public static unsafe int ToFloat(byte[] data, int startIndex)
{
int result = 0;
fixed (byte* ptr = &data[startIndex])
{
result = *((int*)ptr);
}
return result;
}

farhad_shiri_ex
چهارشنبه 04 اردیبهشت 1398, 18:46 عصر
با سلام
من یک برنامه کوچیک نوشتن جهت تبدیل []byte به float .یک تابع که خودم نوشتم و یک تابه که مال خود #C هستش.
مسئله اینجاست وقتی از اول آرایه تبدیل میکنم درسته هر دوتا ولی وقتی از وسط برمیدارم فقط تابع خودم کار میکنه.و تابع خود #C خطا میده.از اونجا که تابع خودم unsafe هستش نمیخام استفاده کنم.


static void Main(string[] args) {


byte[] d = new byte[24];


d[0] = 0xF0;
d[1] = 0x49;
d[2] = 0x02;
d[3] = 0x00; //150000






d[4] = 0xE3;
d[5] = 0x07;//2019






byte[] r = new byte[2];


r[0] = d[4];
r[1] = d[5];



var f1 = BitConverter.ToSingle(r, 0);


float f2 = ToFloat(r, 0);


Console.WriteLine(f1);
Console.WriteLine(f2);
Console.ReadKey();


}


public static unsafe int ToFloat(byte[] data, int startIndex)
{
int result = 0;
fixed (byte* ptr = &data[startIndex])
{
result = *((int*)ptr);
}
return result;
}
پیغام خطا را هم قرار بدید؟
ونکته دیگه اینکه تابع ToFloat شما که یک int برمیگردونه نه یک float ؟؟ اونم فقط یک بایت با یک شماره اندیس مشخص را به int تبدیل میکنه نه کل آرایه !!!
و در ضمن به ارزش بیت ها هم توجه کنید فقط چهار بایت کم ارزشش تبدیل به float خواهد شد.
به این نکته هم ظاهرا توجه نکردید...

Returns a single-precision floating point number converted from four bytes at a specified position in a byte array.

mandagarana
پنج شنبه 05 اردیبهشت 1398, 09:43 صبح
با سلام
حق با شما بود من تغییرش دادم به int32 ولی باز خطا میده.

byte[] d = new byte[6];

d[0] = 0xF0;
d[1] = 0x49;
d[2] = 0x02;
d[3] = 0x00; //150000

d[4] = 0xE3;
d[5] = 0x07;//2019

byte[] r = new byte[2];


r[0] = d[4];
r[1] = d[5];


var f1 = BitConverter.ToInt32(r, 0);


int f2 = ToFloat(r, 0);

Console.WriteLine(f1);
Console.WriteLine(f2);
Console.ReadKey();


}


public static unsafe int ToFloat(byte[] data, int startIndex)
{
int result = 0;
fixed (byte* ptr = &data[startIndex])
{
result = *((int*)ptr);
}
return result;
}



150090

Mahmoud.Afrad
پنج شنبه 05 اردیبهشت 1398, 09:57 صبح
...
150090

در مورد خطا، int یک متغیر چهار بایتی هست و طول آرایه میبایست حداقل 4 باشد.


ولی هنوز معلوم نیست سوالتون مربوط به float هست یا int !!

mandagarana
پنج شنبه 05 اردیبهشت 1398, 11:03 صبح
در مورد خطا، int یک متغیر چهار بایتی هست و طول آرایه میبایست حداقل 4 باشد.


ولی هنوز معلوم نیست سوالتون مربوط به float هست یا int !!


من یه پست دارم که ارایه هستش و مثلا خانه 5و 6 نماینگر یک عدد است(مثلا سال)

 بایت 5 تا 6: یک عدد دو بایتی که مقدار "سال"

بایت 7: یک عدد یک بایتی که مقدار "ماه" به میلادی

خب من باید جدا کنم بعدش سال و ماه رو بدست بیارم
چطوری؟

Mahmoud.Afrad
پنج شنبه 05 اردیبهشت 1398, 11:25 صبح
من یه پست دارم که ارایه هستش و مثلا خانه 5و 6 نماینگر یک عدد است(مثلا سال)

 بایت 5 تا 6: یک عدد دو بایتی که مقدار "سال"

بایت 7: یک عدد یک بایتی که مقدار "ماه" به میلادی

خب من باید جدا کنم بعدش سال و ماه رو بدست بیارم
چطوری؟

اینچنین توضیحاتی باید در پست اول همراه سوال مطرح بشن!


به هر حال؛ مطابق نیازتون از تبدیل مناسب استفاده کنید
byte[] d = new byte[24];
d[0] = 0xF0;
d[1] = 0x49;
d[2] = 0x02;
d[3] = 0x00; //150000
//d[4]....
d[5] = 0xE3;
d[6] = 0x07; //2019 year
d[7] = 0x03; // 3 month

int n1 = BitConverter.ToInt32(d, 0);
short year = BitConverter.ToInt16(d, 5);
int month = d[7];

mandagarana
یک شنبه 15 اردیبهشت 1398, 14:08 عصر
ممنون مشکل توی نوع rader بود.

Mahmoud.Afrad
یک شنبه 15 اردیبهشت 1398, 14:34 عصر
به صورت زیر دریافت کنید ببینید درست دریافت میشه یا نه
System.IO.Stream str;
Int32 strLen, strRead;
// Create a Stream object.
str = Request.InputStream;
// Find number of bytes in stream.
strLen = Convert.ToInt32(str.Length);
// Create a byte array.
byte[] strArr = new byte[strLen];
// Read stream into byte array.
strRead = str.Read(strArr, 0, strLen);