Portál AbcLinuxu, 12. května 2025 08:54

Dotaz: Soucet ascii hodnot retezce

18.12.2006 11:49 MiHl | skóre: 9 | blog: Uvazovnik
Soucet ascii hodnot retezce
Přečteno: 410×
Odpovědět | Admin
Dobry den
Vytvarim skript, ktery potrebuje pro svou praci secist ciselne hodnoty vsech znaku v jednom slove. Nepodarilo se mi ale najit jak ziskat ascii hodnotu jednoho znaku. Zkousel jsem koukat do manualu bashe a awk, ale nic jsem nenasel (mozna jsem spatne hledal). Neuspel jsem ani s ruznymi klicovymi slovy na google. Mohl by mi nekdo poradit?
Dekuji
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

18.12.2006 12:03 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Soucet ascii hodnot retezce
Odpovědět | | Sbalit | Link | Blokovat | Admin

Třeba tohle by mohlo fungovat

  val=`echo -n $char | od -A n -t d1`

Případně na to můžete použít ještě aritmetickou expanzi nebo 'tr -d', abyste se zbavil přebytečných mezer.

18.12.2006 12:23 eh
Rozbalit Rozbalit vše Re: Soucet ascii hodnot retezce
Odpovědět | | Sbalit | Link | Blokovat | Admin
Cisty BASH:
---CUT---
#!/bin/bash

ord()
{
        IFS= printf '%d' "'$1"
}

ordsum(){
        local in="$1"
        local size=${#in}
        local i=0
        local ret=0

        for (( i = 0; i <= $size; ++i ))
        do
                (( ret += $( ord "${in:0:$i}" ) ))
        done

        printf -- '%d' $ret
}

ordsum "Hello, World!"

exit 0
---CUT---
18.12.2006 12:27 eh
Rozbalit Rozbalit vše Re: Soucet ascii hodnot retezce
Promin, jeste jsem to krapet upravil (pro jistotu)...
---CUT---
#!/bin/bash

ord()
{
        printf -- '%d' "'$1"
}

ordsum()
{
        local in="$1"
        local size=${#in}
        local i=0
        local ret=0

        for (( i = 0; i <= $size; ++i ))
        do
                (( ret += $( ord "${in:0:$i}" ) ))
        done

        printf -- '%d' $ret
}

ordsum "Hello, World!"

exit 0
---CUT---
18.12.2006 12:41 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Soucet ascii hodnot retezce
Ten příkaz ord asi nebude moc standardní záležitost, aspoň já ho ve svém systému nemám. Navíc vám to bude fungovat jen tehdy, pokud ten příkaz vypíše kód posledního znaku svého argumentu.
18.12.2006 12:49 eh
Rozbalit Rozbalit vše Re: Soucet ascii hodnot retezce
Funkce ord() je napsana take v BASHi a je to tak trochu trik. Odpovida vsak POSIX norme; melo by to byt v poradku. Vy deklaraci te funkce nevidite? V systemu ji opravdu nenajdete...
#!/bin/bash

ord()
{
        printf -- '%d' "'$1"
}

ord "A"   # vypise cislo 65
Nerozumim vsak "ten prikaz ... atd." Vysvetlite, co mate na mysli? Mam takovy pocit, ze si nejak nerozumime... :-D
18.12.2006 12:55 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Soucet ascii hodnot retezce
Deklaraci funkce jsem přehlédl. Tak či onak vám to stejně nefunguje, vaše funkce vypíše kód prvního znaku řetězce násobený počtem znaků. Navíc je otázka, co s tím udělá UTF-8, ale pak to bylo především potřeba nejdřív upřesnit zadání…
18.12.2006 13:05 eh
Rozbalit Rozbalit vše Re: Soucet ascii hodnot retezce
Bude fungovat spravne asi jen ASCII vstup (vcetne kontrolnich znaku atd). UTF8 asi fungovat nebude, alespon ne tak, jak mate na mysli. (Nevim to jiste, protoze jsem nikdy UTF8-enabled scripty v BASHi nepsal. Stalo by to za zkousku, ale momentalne me nenapada moc jak, kdyz UTF8 v systemu vubec nemam...)

Navic, kolega se ptal na soucet "znaku" a ja predpokladal, ze znakem se zde mysli znak z mnoziny ASCII znaku. Pokud zadate vstup ve vicebytovem kodovani, dojde k tomu, ze to funkce ordsum() projde "znak po znaku", tedy "byte po bytu" a secte se to. Nezkousel jsem nikdy, jak se BASH zachova pri jinak nastavenych locales nez na "C". Jestli mate jak to vyzkouset, rad bych to vedel.
18.12.2006 13:11 eh
Rozbalit Rozbalit vše Re: Soucet ascii hodnot retezce
Jezismarja, co jsem to za pitomce! Takovej pitomej preklep. Takto to bude fungovat (omlouvam se puvodnimu tazateli):
---CUT---
#!/bin/bash

ord()
{
        printf -- '%d' "'$1"
}

ordsum()
{
        local in="$1"
        local size=${#in}
        local i=0
        local ret=0

        for (( i = 0; i <= $size; ++i ))
        do
                (( ret += $( ord "${in:$i:1}" ) ))
        done

        printf -- '%d' $ret
}

[[ $(ordsum "ABC") -eq $((65+66+67)) ]] && echo "FUNGUJE!"

exit 0
---CUT---
Fakticky se moc omlouvam... :-(
18.12.2006 12:56 eh
Rozbalit Rozbalit vše Re: Soucet ascii hodnot retezce
Mam samozrejme na mysli tu druhou vasi vetu. Na tu prvni jsem snad uz odpovedel...
18.12.2006 17:10 MiHl | skóre: 9 | blog: Uvazovnik
Rozbalit Rozbalit vše Re: Soucet ascii hodnot retezce
Odpovědět | | Sbalit | Link | Blokovat | Admin
Diky vsem, za napady

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.