PDA

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



soodi1100
پنج شنبه 01 آبان 1393, 13:07 عصر
باسلام

من 4 تا عدد دارم
این اعداد از 0 تا 65535 هستند ، حالا من میخام این 4 تاعدد رو بازه تغییراتشون رو از 0 تا 65535 برسونم به از 0 تا 255 ، یعنی 0 بشه 0 و 65535 بشه 255 و حالا بتونم هر کدوم از این اعداد رو به یک کد اسکی تبدیل کنم و ارسال کنم و حدود 1 کیلومتر اونطرفتر ، این 4 تا کد اسکی رو دریافت کنم و به 4 تا عدد (همون اعداد بین 0 تا 255) تبدیل کنم
این کار رو برای این میخام انجام بدم تا سرعت انتقال اطلاعاتم بالا بره
ممنون میشوم که در مورد تغییر بازه عدد ها و در مورد تبدیل به کد اسکی و تبدیل از کد اسکی به عدد توضیح بدید

تشکر فراوان

negative60
پنج شنبه 01 آبان 1393, 15:59 عصر
برای تبديل اسکی به بايت تابعی لازم نيست ميتونيد اعداد 0 تا 255 رو مساوی با يک بايت قرار بديد
char S = 75;


هر بايت ميتونه نهايتاً 256 مقدار رو نگه داره پس بايد 2 بايت برای هر عدد اختصاص بديد (256 * 256) که ميشه 65536 که همون مقداری هست که لازم داريد پس 8 بايت لازم داريد که تو هر 2 بايت يک عدد قرار ميگيره.
در سمت گيرنده ميبايست بايت ها رو دوتا دوتا از هم جدا و تبديل به عدد کنيد



void NumberToChar(int intNumber, char *result)
{
if(intNumber > 65535) result;
int A = (intNumber / 256);
int B = (intNumber % 256);


char cN[] = {A,B};
memcpy(result, cN, 2);
}


int CharToNumber(const char *chNumber, int n)
{
int res;
int A = chNumber[n];
int B = chNumber[n+1];


if(B < 0) B += 256;
if(A < 0) A += 256;


res = (A * 256) + B;
return res;
}


int main()
{


char Buff[8];
NumberToChar(10, Buff+0);
NumberToChar(42536, Buff+2);
NumberToChar(8954, Buff+4);
NumberToChar(65535, Buff+6);

//yek kilometer onvartar
int num1 = CharToNumber(Buff, 0); //0 Or 2 Or 4 Or 6
int num2 = CharToNumber(Buff, 2);
int num3 = CharToNumber(Buff, 4);
int num4 = CharToNumber(Buff, 6);


}

soodi1100
دوشنبه 05 آبان 1393, 10:35 صبح
سلام

تشکر بسیار بسیار فراوان از توضیحات عالیتان
ولی یه مشکلی هست ، من 4 عدد اصلیم قبلا از 0 تا 65535 بود که توضیحات شما بسیار کار آمد شد ولی الان 4تا عددم از 0 تا 4096 هست که باید به از 0 تا 255 تبدیل بشه و بعد به اسکی تبدیل بشه و بعد 1 کیلومتر اونطرفتر دوباره از اسکی به 4 تا عدد از 0 تا 4096 تبدیل بشه
ممنون میشوم بازم راهنمایی کنید

تشکر فراوان

negative60
دوشنبه 05 آبان 1393, 11:34 صبح
الان 4تا عددم از 0 تا 4096 هست که باید به از 0 تا 255 تبدیل بشه و بعد به اسکی تبدیل بشه و بعد 1 کیلومتر اونطرفتر دوباره از اسکی به 4 تا عدد از 0 تا 4096 تبدیل بشه


تو اون مثال ماکسيمم 65535 هست، و برای هر عددی که کوچيکتر از اين مقدار باشه قابل استفاده هست!
اون مثال هم همين کار رو انجام ميده اعداد توسط تابع NumberToChar به بايت تبديل ميشن و تو آرايه Buff قرار ميگيرند حالا شما بايد اين آرايه رو بفرستيد به مقصد و اونجا با تابع CharToNumber تبديل به عدد کنيد

soodi1100
دوشنبه 05 آبان 1393, 13:13 عصر
سلام

تشکر فراوان
ولی کامپایلر ارورو های زیر رو به تابع میگیره :
فکر کنم اول تابع باید همه متغیر ها رو معرفی کنیم و بعد توی تابع ازشون استفاده کنیم ، این روشی که شما استفاده کردید (همزمان ساختید و مقدار دهی کردید) فکر کنم به همین ایراد میگیره اگر راهنمایی کنید تا حلش کنم ممنون میشوم




Program.c(18): warning: #174-D: expression has no effect
if(intNumber > 65535) result;
Program.c(19): error: #268: declaration may not appear after executable statement in block
int A = (intNumber / 256);
Program.c(20): error: #268: declaration may not appear after executable statement in block
int B = (intNumber % 256);
Program.c(23): error: #268: declaration may not appear after executable statement in block
char cN[] = {A,B};
Program.c(23): error: #28: expression must have a constant value
char cN[] = {A,B};
Program.c(23): error: #28: expression must have a constant value
char cN[] = {A,B};

soodi1100
دوشنبه 05 آبان 1393, 13:37 عصر
الان تابع رو به صورت زیر تغییر دادم
ولی بازم این ارور ها رو میگیره :


void NumberToChar(int intNumber, char *result)
{
int A,B;

if(intNumber > 65535) result;
A = (intNumber / 256);
B = (intNumber % 256);

char cN[]={A,B};

memcpy(result, cN, 2);
}


ارور ها :


Program.c(24): error: #268: declaration may not appear after executable statement in block
char cN[]={A,B};
Program.c(24): error: #28: expression must have a constant value
char cN[]={A,B};
Program.c(24): error: #28: expression must have a constant value
char cN[]={A,B};

negative60
دوشنبه 05 آبان 1393, 16:48 عصر
اون مثال با ++C هست يا اسم فايلتون رو به Program.cpp تغيير بديد يا قسمت هايی که خطا ميگيره رو طبق استاندارد C بنويسيد

char cN[1];
cN[0] = A;
cN[1] = B;

soodi1100
سه شنبه 25 آذر 1393, 12:54 عصر
سلام

تشکر
آقا من حالا میخام این Buff رو از طریق پورت سریال ارسال کنم روی کامپیوتر ، ولی پورت سریال 8 بیت ، 8 بیت باید ارسال بشه ، اینو چطوری ارسال کنم ؟؟؟

abblue2
دوشنبه 15 دی 1393, 17:54 عصر
سلام.یک سری به این سایت بزنید
http://skycurious.ir