Bir algoritma sorusu "Hex format düzenleme"

Başlatan baran123, 04 Eylül 2017, 13:07:59

baran123

STM32 ile SD karttan hex uzantılı dosya okuyorum.
Amacım bu okuduğum dataları yazmaya uygun hale getirme, düzenlemek.
Okuduğum örnek bir satır şu şekilde
:020000040800F2

Şimdi bu koddan şu şekilde ayıklama yapmam lazım.
0x02 0x00 0x00 0x04 0x08 0x00 0xF2

Fakat SD kartı okuyunca buradaki her karakter bana bir byte olarak geldiği için benim okuduğum her iki 4 biti birleştirip 8 bit yapmam gerek.
Bu çok kolay
(A << 4) | B

Şeklinde yaparız. Ben bunu dizi halinde yaptığımda her şey düzgün ama son byte'ı yani 0xF2 yi bir türlü alamıyorum. 0x72 olarak çıkıyor.
Nerede hata yapıyorum ?
void foo(uint8_t line[])
{
	uint8_t dataArray[7];
	
	if (line[0] == ':')
	{
		for (uint8_t i = 0, k = 0; i < 7; i++, k += 2)
		{
			dataArray[i] = (uint8_t)(line[k + 1] << 4UL) | line[k + 2];
		}
	}
}


Tagli

ASCII karakterlerini rakama nasıl çeviriyorsun? Kodda göremedim. Belki bununla ilgili bir sorun olabilir. Ayrıca, ASCII tablosunda 0-9 grubu ile A-F grubu birbiri ardına gelmiyor, belki bununla ilgili bir hata yapmışsındır. 0xF2'yi düzgün alamadığını söylemişsin, verdiklerin arasında içinde harf olan sadece o var. Acaba sonda olduğu için mi hatalı geliyor yoksa içinde F olduğu için mi?
Gökçe Tağlıoğlu

baran123

#2
@Tagli hocam line dizisini fonksiyon içerisinde direk olarak bastırdığımda görüyorum burada problem yok.
Sadece dönüştürünce problem çıkıyor.


Bu arada bu kodu bilgisayarda direk olarak çalıştırdığımda düzgün sonuç alıyorum.

NOT : Ben bilgisayarda denerken 'F' yerine direk olarak 15 yazıyordum çalışması normalmiş :)
Sanırım "sscanf" fonksiyonunu kullanmam gerekiyor dimi hocam ?

baran123

Evet cevap sscanf fonksiyonuymuş

uint8_t temp;

for (uint8_t i = 0, j = 0; i < 7; i++, j +=2)
{
	sscanf(&line[j+1], "%2x", &temp);
	dataArray[i] = temp;
}

@Tagli teşekkürler hocam