ورود

View Full Version : گفتگو: تبديل هگز به باينري



noshin156
چهارشنبه 03 خرداد 1391, 13:49 عصر
سلام
اين كد يه عدد هگز رو به بانري تبديل مي كنه دوست دارم بدونم از نظر كاربردي برنامه بهتري هم وجود داره؟:متفکر:



char p[8]="0xAB14";
char g[5]={""};
char m[24]={""};
for(int j=2;j<strlen(p);j++)
{
switch (p[j])
{
case '0': strcpy(g,"0000"); break;
case '1': strcpy(g,"0001"); break;
case '2': strcpy(g,"0010"); break;
case '3': strcpy(g,"0011"); break;
case '4': strcpy(g,"0100"); break;
case '5': strcpy(g,"0101"); break;
case '6': strcpy(g,"0110"); break;
case '7': strcpy(g,"0111"); break;
case '8': strcpy(g,"1000"); break;
case '9': strcpy(g,"1001"); break;
case 'A': strcpy(g,"1010"); break;
case 'B': strcpy(g,"1011"); break;
case 'C': strcpy(g,"1100"); break;
case 'D': strcpy(g,"1101"); break;
case 'E': strcpy(g,"1110"); break;
case 'F': strcpy(g,"1111"); break;
}
strcat(m,g);
}

ASGGSA
چهارشنبه 03 خرداد 1391, 15:48 عصر
سلام.
عدد در مبنای 16 رو ابتدا به مبنای 10 با استفاده از تابع strtoul بعد این عدد که در مبنای 10 هست رو به مبنای 2 ببرید.

mehdi.mousavi
چهارشنبه 03 خرداد 1391, 16:26 عصر
اين كد يه عدد هگز رو به بانري تبديل مي كنه دوست دارم بدونم از نظر كاربردي برنامه بهتري هم وجود داره؟سلام.
از نظر کاربردی؟؟؟ هووممم... من کلا به switch های طولانی بدبین هستم (توصیه می کنم شما هم باشید)، بخصوص اونهایی که در حقله قرار میگیرن...
مگر برای Optimize کردن بخشی از کد که با سخت افزارهای جانبی کار میکنه و Performance در اون حائز "اهمیت بالایی" باشه.
در هر حال، کد فوق رو میشه بدین شکل باز نویسی کرد (اگر فرض کنیم که رشته مزبور، حاوی کاراکترهای غیر منتظره نیست):


LPCSTR p = "AB14\0", ptr = p;
while(ptr && ptr[0] != NULL)
{
char ch = ptr++[0];
std::bitset<sizeof(char) * 4> binary(ch <= '9' && ch >= '0' ? ch - 48: ch - 65 + 10);
std::cout << binary;
}

فراموش نکنید که bitset رو در header فایل ها، include کنید.

موفق باشید.

ASGGSA
چهارشنبه 03 خرداد 1391, 18:36 عصر
سلام.
تابع زیر دو کار را هم زمان انجام می دهد هم عدد در مبنای 16 را به مبنای 2 می برد و هم مقدار آن را در مبنای 10 بدست می آورد. برای مبنای 2 یک رشته و برای مبنای 10 مقداری را برمی گرداند.

unsigned int HexToBinAndDec(const char *hex, char *bin)
{
bin[0] = NULL;
unsigned int value = 0;
char ch = *hex;
const char* quads[] = {"0000", "0001", "0010", "0011", "0100", "0101",
"0110", "0111", "1000", "1001", "1010", "1011",
"1100", "1101", "1110", "1111"};
for (;;)
{
if(ch >= '0' && ch <= '9')
{
strcat(bin, quads[ch - '0']);
value = (value << 4) + (ch - '0');
}
else if(ch >= 'A' && ch <= 'F')
{
strcat(bin, quads[10 + ch - 'A']);
value = (value << 4) + (ch - 'A' + 10);
}
else if(ch >= 'a' && ch <= 'f')
{
strcat(bin, quads[10 + ch - 'a']);
value = (value << 4) + (ch - 'a' + 10);
}
else
return value;
ch = *(++hex);
}
}


توجه کنید، اگر رشته ای دارید که مقادیر مبنای 16 در آن است یعنی آن رشته را از تابع دیگری گرفته اید این رشته را بررسی کنید که مثلاً بصورت 0x1A نباشد اگر به این صورت بود باید کاراکترهای 0x را پاک کنید تا بصورت 1A در بیاید در اینصورت جواب بدست آمده صحیح است.

mehdi.mousavi
چهارشنبه 03 خرداد 1391, 19:59 عصر
سلام.
اگر فرض کنیم که Nibble ها رو قراره در کد لیست کنیم (که در نهایت منجر به بهترین Performance میشه)،
میتونیم کد فوق رو بدین شکل تغییر بدیم، تا خوانا بشه:

void Hex2Bin(LPCSTR pHex, LPSTR pDest)
{
LPCSTR pNibbles[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
LPCSTR ptr = (LPSTR)pHex;

while(ptr && ptr[0] != NULL)
{
char ch = toupper(ptr++[0]);
int index = ch <= '9' && ch >= '0' ? ch - 48: ch - 65 + 10;
strcat(pDest, pNibbles[index]);
}
}


موفق باشید.