PDA

Tam Sürümünü Görmek İçin : Hex to Integer Yardım Eder misiniz? Lütfen?


Jayhoonova
19/04/2005, 10:00
Merhaba
Ben C/C++ Bilmiyorum ancak elimde veritabanından gelen bir veri var ve bu veri C koduna girip bir şekilde çıkarken grafik çiziyor... Ben bu grafiğin aynısını php de çıkartmak istiyorum. Çizim ile ilgili php de tek ihtiyacım olan verilerin düzgün şekilde php de değişkenime vermek... Ancak C de gelen kodun nasıl bir mantıkla çevrilip anlamlı bir X,Y koordinatına geldiğini halen çözemedim...
Aşağıda vereceğim kodlara biraz bakıp Bu gelen verinin x, y olarak neleri verdiğini söyleyebilir misiniz? Ben de php de ona göre anlamlı birşey yazayım

gelen veri : 80210021002100210022002300250025002600260026002700 28002B002C002E0030003100340036003A003F00420047004B 00500055005B00600068006F0078007F00880090009800A000 A900B100B900C100C900D000D700DE00E500EB00F000F700FC 01010105010A010F01140119011F012901390154018401DF02 7D0377


Yorumlayan kod


void COrnekTakipElekroForez::GrafikYazdir()
{

if (GragikLog.IsEmpty())
return;

int FrantionCount = 0;
POINT Fraktion [10] ;

POINT apt [300] ;

int KY = 0;

CString Str;
Str.Format("%d",currsatir);

int j = 0;
int x = 150;

for (int i = 0; i < 1200 ; i = i + 4,j++)
{
CString Fraction = GragikLog.Mid(i,1);

int Y = BBHexToInt(GragikLog.Mid(i + 1,3));

//CETDEGIS_AFTBRS_OK
//apt[j].y = currsatir + 1200 - Y / 3;
apt[j].y = currsatir + 1450 - Y / 3;
//CETDEGIS_AFTBRS_OK
apt[j].x = x;
x = x + 7;

if (KY < apt[j].y)
KY = apt[j].y;

if (Fraction[0] == '8' || Fraction[0] == 'C')
{
Fraktion[FrantionCount].y = apt[j].y;
Fraktion[FrantionCount].x = apt[j].x;
FrantionCount++;
}
}



CPen pen;

pen.CreatePen(PS_SOLID, 0,RGB(0,255,0));
CPen* pOldpen = PSS->dc->SelectObject(&pen);

for (i = 0; i < FrantionCount;i++)
{
PSS->dc->MoveTo(Fraktion[i].x,Fraktion[i].y);
PSS->dc->LineTo(Fraktion[i].x,KY + 30);
}

if (FrantionCount > 0)
{
PSS->dc->MoveTo(apt[0].x,KY);
PSS->dc->LineTo(Fraktion[FrantionCount - 1].x,KY);
}

PSS->dc->SelectObject(pOldpen);

PSS->dc->LPtoDP(apt, 300) ;
PSS->dc->Polyline (apt, 300);



//PSS->dc->LPtoDP(Fraktion, 10) ;

}


int BBHexToInt(CString& sHex)
{
if(sHex.IsEmpty())
return 0;
int dgr = 0;

for(int i = sHex.GetLength() - 1,j =0; i >= 0;--i,++j)
{
double dgr0 = pow((double)16,(double)i);
int dgr1;
if(sHex[j] >= '0' && sHex[j] <= '9')
dgr1 = sHex[j] - '0';
else
dgr1 = 10 + sHex[j] - 'A';
dgr += ((int)dgr0 * dgr1);
}

return dgr;
}


acehreli
19/04/2005, 21:46
Benim anladigim soyle: BBHexToInt cagrildiginda sHex'in "89AB" oldugunu varsayarsak, sonucta dOndUrulen dgr su oluyor:

(8 * 16^3) + (9 * 16^2) + (10 * 16^1) + (11 * 16^0) = (8 * 4096) + (9 * 256) + (10 * 16) + (11 * 1) = /* her ne ise :) */

(^ karakterini us almak anlaminda kullandim.)

Yani, BBHexToInt gelen karakterleri onaltilik duzenden ondalik duzene ceviriyor.

Notlar:

- pow islevi, us alir. dgr0; 1, 16, 256, 4096, vs. degerlerini tasiyor.

- dgr1 ise o katsayilarin kacla carpilacaklarini tasiyor. Karakter kodlarina bakarsak, '1' karakteri '0'dan hemen sonra gelir. Onun icin; sHex[j]'in '1' karakteri oldugunu varsayarsak, sHex[j] - '0' islemi ikisinin farki olarak 1 degerini veriyor.

Ayni sekilde, ornegin 'F' karakteri de 'A' karakterinden bes karakter sonradir. sHex[j]'in 'F' oldugunu varsayarsak, (10 + sHex[j] - 'A') islemi 15 degerini veriyor.

x degeri gelen veriden alinmiyor; hayatina 150 olarak basliyor ve her seferinde 7 artiyor.

GragikLog.Mid() islevi herhalde GragikLog'un (verinin) belirli karakterlerini okumak icin kullaniliyor. Mid(i,1) tek bir karakter aliyor; buna Fraction adini veriyoruz. Mid(i+1,3) ise Y icin kullaniliyor.

GrafikYazdir islevindeki for(i) dongusune baktigimda i'nin her seferinde 4 arttirildigini goruyorum. Her dort karakter su anlama geliyorlar:

1 karakter: Fraction
3 karakter: Y'nin onaltili gosterimi

Demek ki BBHexToInt'i anlarken kullandigim "89AB" dizgisini dogru uzunlukta secmemisim. Aslinda BBHexToInt her seferinde 3 karakter uzunlugunda dizgiler aliyormus. (Ama olsun.)

Bu durumda verinin bas tarafi soyle algilanabilir (F ile Fraction kastediyorum):

F0: 8
Y0: 021

F1: 0
Y1: 021

F2: 0
Y2: 021

vs.

Yani ilk uc Y degeri birbirinin aynisi. Eh, olur oyle :)

Fraction karakterinin 8 veya C olmasi ozel bir anlam tasiyor. Oyle oldugunda x ve y degerlerini sakliyoruz ve FrantionCount'u bir arttiriyoruz.

Daha sonra da asil cizme isini bu Fraktion dizisi ile gerceklestiriyoruz.

KY simdiye kadar gorulen en yuksek Y degerini sakliyor.

CPen'den sonraki ilk for dongusu (x,y) noktasindan (x,KY+30)'a kadar cizgi cekiyor. Grafigi x eksenine dik cizgiler olarak mi gosteriyoruz yani?

Benden bu kadar... :)

Ali