Keresés

Új hozzászólás Aktív témák

  • sghc_toma

    senior tag

    válasz ALI_G #2674 üzenetére

    mért akarod mindenképp elkerülni a konverziót?
    strtol-lal konvertálsz int-té, itoa-val meg vissza.. én vhogy így csinálnám, aztán lehet, hogy tényleg van jobb megoldás.. (az is lehet. hogy ez az egyik legrosszabb :DDD )

    char* HexNumber = ''CDAB'';
    char* FirstTwoBytes;
    memcpy(FirstTwoBytes, HexNumber, 2);

    int a = strtol(HexNumber + 2, NULL, 16) * 128 + (int)(strtol(FirstTwoBytes, NULL, 16) / 2);

    char buf[4];
    HexNumber = itoa(a, buf, 16);

    memcpy(FirstTwoBytes, HexNumber + 2, 2);
    memcpy(HexNumber + 2, HexNumber, 2);
    memcpy(HexNumber, FirstTwoBytes, 2);

  • Jester01

    veterán

    válasz ALI_G #2674 üzenetére

    Ugye a kettővel osztás az egy bit léptetés. Hexa ábrázolás esetén a szomszédos jegy legalsó bitje kell még a működéshez.

    Számolgatással pl. így lehet:

    inline char to_hex(int v)
    {
    return v > 9 ? (v + 'A' - 10) : (v + '0');
    }

    inline int from_hex(char c)
    {
    return c > '9' ? (c - 'A' + 10) : (c - '0');
    }

    void shift(char* buffer)
    {
    int i;
    int carry = 0;
    for(i = 3; i >= 0; i--)
    {
    int v = from_hex(buffer[ i ]);
    buffer[ i ] = to_hex((v >> 1) | carry);
    carry = (v << 3) & 8;
    }
    }


    Ha a számolgatás nem tetszik, akkor lookup táblát is lehet csinálni, pl így:

    void shift(char* buffer)
    {
    static struct { char out[2], f; } map['G'] = {
    ['0'] = {''08'', 0},
    ['1'] = {''08'', 1},
    ['2'] = {''19'', 0},
    ['3'] = {''19'', 1},
    ['4'] = {''2A'', 0},
    ['5'] = {''2A'', 1},
    ['6'] = {''3B'', 0},
    ['7'] = {''3B'', 1},
    ['8'] = {''4C'', 0},
    ['9'] = {''4C'', 1},
    ['A'] = {''5D'', 0},
    ['B'] = {''5D'', 1},
    ['C'] = {''6E'', 0},
    ['D'] = {''6E'', 1},
    ['E'] = {''7F'', 0},
    ['F'] = {''7F'', 1}
    };
    int i;
    int flag = 0;
    for(i = 3; i >= 0; i--)
    {
    char c = buffer[ i ];
    buffer[ i ] = map[c].out[flag];
    flag = map[c].f;
    }
    }


    Hibakezelés ezekben nyilván nincs.
    Más ötlet momentán nem jut eszembe.

    [Szerkesztve]

Új hozzászólás Aktív témák