String fonksiyonu yazamadım?

Endorfin35+

Kayıtsız Üye
Staff member
Katılım
1 Mayıs 2020
Mesajlar
3,855
1695022289544.png


Yukarıdaki gibi bir fonksiyonum var ve görüldüğü üzere bir döngü yardımı ile byte dizisini hex olarak stringe dönüştürüp yazdırıyorum. Amacım bu kadar basit.
Hex kodunu görselleştirme amacı ile bir karakter ile bir birinden ayırmak istediğimde saçma sonuçlar alıyorum. bir sürü şey denemedim ama işin içinden çıkamadım.

1695022611523.png


Dizide tek byte var ise istediğim gibi - sembolu ekleniyor ama birden çok byte var ise resimdeki gibi saçma sonuçlar alıyorum.
 

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
17,836
String gibi dinamik olarak boyutlandırma yapan bir class ile işi yaparsan çok verimsiz olur. büyük array'lerde uzun zaman alır. Aşağıdaki sana bir alternatif önereyim. Terminalde denedim, çalışıyor gibi, ama iyi inceleyip her alternatifte doğru davrandığını teyit etmek lazım.

C++:
void make_hex_str(const unsigned char* src, unsigned int srclen, char* dest, unsigned int destsize)
{
    unsigned int dest_avail = destsize / 3;

    for (unsigned int i = 0; (i < srclen) && (i < dest_avail); ++i, destsize -= 3)
    {
        snprintf(dest + i * 3, destsize, "%02X ", src[i]);
    }
}

Bu da deneme programı:

C++:
#include <stdio.h>
#include <string.h>

unsigned char bytes[] = {0x7A, 0x32, 0x89, 0xFF};

char hexstr[100];

void make_hex_str(const unsigned char* src, unsigned int srclen, char* dest, unsigned int destsize)
{
    unsigned int dest_avail = destsize / 3;

    for (unsigned int i = 0; (i < srclen) && (i < dest_avail); ++i, destsize -= 3)
    {
        snprintf(dest + i * 3, destsize, "%02X ", src[i]);
    }
}

int main()
{
    make_hex_str(bytes, sizeof(bytes), hexstr, sizeof(hexstr));

    printf("hexstr = (%s)\n", hexstr);

    return 0;
}

Bash:
[ta@bonsai ~]$ g++ -Wall a.cpp
[ta@bonsai ~]$ ./a.out
hexstr = (7A 32 89 FF )
[ta@bonsai ~]$
 

Endorfin35+

Kayıtsız Üye
Staff member
Katılım
1 Mayıs 2020
Mesajlar
3,855
Deneyeceğim teşekkür ederim. Aslında String ile hiç işim yok. Ancak bu esp32 nin hoşuma giden bir debug sistemi var ve sadece printf gibi çalışıyor. Tek satırda hex göstermenin tek yolu da string kullanmak. Gerçi %s ile char array kabul etmiş gibi duruyor. Denemem lazım şimdilik o bölümü geçtim. Sonra tekrar dönerim...

 

Ahmet

Kıdemli Üye
Katılım
31 Mayıs 2021
Mesajlar
5,285
substring burada iş yapar gibi geldi ama emin olamadım
 

ckocagil

Aktif Üye
Katılım
24 Aralık 2019
Mesajlar
676
Varsa c_str() de olur ama doğrudan şu şekilde yazmak en iyisi:

C:
void printHex(char *str) {
  printf("Hex: ");
  for (char *s = str; *s != NULL; ++s)
    printf("%x ", *s);
  printf("\n");
}
 
Top