\x used with no following hex digits

Discussion in 'C Programming' started by abhi147@gmail.com, Jul 31, 2006.

  1. Guest

    Hi ,

    I have a program where I want to print a string
    "457e31b2db200dc125f3e00886ff57de"
    like "\x45\x7e\x31\xb2\xdb\x20\x0d\xc1\x25\xf3\xe0\x08\x86\xff\x57\xde"
    .. But in each and every case it is giving an error :

    test.c:16:9 : \x used with no following hex digits

    *********Test.c****************
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <locale.h>
    #include <wchar.h>

    int main(int argc, char* argv[])
    {
    int i;
    unsigned char mbBuf[16] = "457e31b2db200dc125f3e00886ff57de";
    for(i=0;i<16;i++)
    printf("\x%02",mbBuf);
    }

    Need help !!
     
    , Jul 31, 2006
    #1
    1. Advertising

  2. In article <>,
    <> wrote:
    > I have a program where I want to print a string
    >"457e31b2db200dc125f3e00886ff57de"
    >like "\x45\x7e\x31\xb2\xdb\x20\x0d\xc1\x25\xf3\xe0\x08\x86\xff\x57\xde"


    > printf("\x%02",mbBuf);


    printf("\\x%02",mbBuf);

    When you want a \ to appear in the output string, you have to
    escape the \ by doubling it.
    --
    "No one has the right to destroy another person's belief by
    demanding empirical evidence." -- Ann Landers
     
    Walter Roberson, Jul 31, 2006
    #2
    1. Advertising

  3. wrote:
    > Hi ,
    >
    > I have a program where I want to print a string
    > "457e31b2db200dc125f3e00886ff57de"
    > like "\x45\x7e\x31\xb2\xdb\x20\x0d\xc1\x25\xf3\xe0\x08\x86\xff\x57\xde"
    > . But in each and every case it is giving an error :


    [OP's code at EOM]

    #include <stdio.h>

    int main(void)
    {
    unsigned char mbBuf[] = "457e31b2db200dc125f3e00886ff57de";
    unsigned i, n = sizeof mbBuf - 1;
    for (i = 0; i < n; i += 2)
    printf("\\x%c%c", mbBuf, mbBuf[i + 1]);
    return 0;
    }



    [OP's code]
    > test.c:16:9 : \x used with no following hex digits
    >
    > *********Test.c****************
    > #include <stdio.h>
    > #include <stdlib.h>
    > #include <string.h>
    > #include <locale.h>
    > #include <wchar.h>
    >
    > int main(int argc, char* argv[])
    > {
    > int i;
    > unsigned char mbBuf[16] = "457e31b2db200dc125f3e00886ff57de";
    > for(i=0;i<16;i++)
    > printf("\x%02",mbBuf);
    > }
     
    Martin Ambuhl, Jul 31, 2006
    #3
  4. "Walter Roberson" <-cnrc.gc.ca> ha scritto nel messaggio
    news:eakgre$a2o$...
    > In article <>,
    > <> wrote:
    > > I have a program where I want to print a string
    > >"457e31b2db200dc125f3e00886ff57de"
    > >like "\x45\x7e\x31\xb2\xdb\x20\x0d\xc1\x25\xf3\xe0\x08\x86\xff\x57\xde"

    >
    > > printf("\x%02",mbBuf);

    >
    > printf("\\x%02",mbBuf);


    Wrong code. You don't print mbBuf.

    >
    > When you want a \ to appear in the output string, you have to
    > escape the \ by doubling it.



    #include <stdio.h>
    #include <stdlib.h>

    int main(void)
    {
    int i;
    /* even number of chars !!! */
    unsigned char mbBuf[] = "457e31b2db200dc125f3e00886ff57de";

    for(i=0;i<(sizeof(mbBuf) / sizeof(mbBuf[0]))/2;i++) {
    printf("\\x%c%c",mbBuf[2*i],mbBuf[2*i+1]);
    }
    printf("\n");
    return EXIT_SUCCESS;
    }


    --
    Giorgio Silvestri
    DSP/Embedded/Real Time OS (RTOS) Software Engineer
     
    Giorgio Silvestri, Jul 31, 2006
    #4
  5. Martin Ambuhl wrote:
    > wrote:
    >> Hi ,
    >>
    >> I have a program where I want to print a string
    >> "457e31b2db200dc125f3e00886ff57de"
    >> like "\x45\x7e\x31\xb2\xdb\x20\x0d\xc1\x25\xf3\xe0\x08\x86\xff\x57\xde"
    >> . But in each and every case it is giving an error :

    >
    > [OP's code at EOM]
    >
    > #include <stdio.h>
    >
    > int main(void)
    > {
    > unsigned char mbBuf[] = "457e31b2db200dc125f3e00886ff57de";
    > unsigned i, n = sizeof mbBuf - 1;

    ^^^
    should be 2. Sorry.
    [e.g. if mbBuf[] = "1234", the last pair begins at mbBuf[2].
    sizeof mbBuf is 5, n = 3, and 2 is the largest integer
    less than 3]. Or I could set n = strlen(mbBuf) - 1 instead,
    but only at the cost of an extra function call and #including
    <string.h>.]

    > for (i = 0; i < n; i += 2)
    > printf("\\x%c%c", mbBuf, mbBuf[i + 1]);
    > return 0;
    > }
    >
    >
    >
    > [OP's code]
    >> test.c:16:9 : \x used with no following hex digits
    >>
    >> *********Test.c****************
    >> #include <stdio.h>
    >> #include <stdlib.h>
    >> #include <string.h>
    >> #include <locale.h>
    >> #include <wchar.h>
    >>
    >> int main(int argc, char* argv[])
    >> {
    >> int i;
    >> unsigned char mbBuf[16] = "457e31b2db200dc125f3e00886ff57de";
    >> for(i=0;i<16;i++)
    >> printf("\x%02",mbBuf); }
     
    Martin Ambuhl, Jul 31, 2006
    #5
  6. "Martin Ambuhl" <> ha scritto nel messaggio
    news:...
    > wrote:
    > > Hi ,
    > >
    > > I have a program where I want to print a string
    > > "457e31b2db200dc125f3e00886ff57de"
    > > like "\x45\x7e\x31\xb2\xdb\x20\x0d\xc1\x25\xf3\xe0\x08\x86\xff\x57\xde"
    > > . But in each and every case it is giving an error :

    >
    > [OP's code at EOM]
    >
    > #include <stdio.h>
    >
    > int main(void)
    > {
    > unsigned char mbBuf[] = "457e31b2db200dc125f3e00886ff57de";
    > unsigned i, n = sizeof mbBuf - 1;
    > for (i = 0; i < n; i += 2)
    > printf("\\x%c%c", mbBuf, mbBuf[i + 1]);
    > return 0;
    > }


    It could not work.

    Missing:

    printf("\n"); /* :) */

    before

    return 0;


    --
    Giorgio Silvestri
    DSP/Embedded/Real Time OS (RTOS) Software Engineer
     
    Giorgio Silvestri, Jul 31, 2006
    #6
  7. Giorgio Silvestri wrote:
    > "Martin Ambuhl" <> ha scritto nel messaggio
    > news:...
    >> wrote:
    >>> Hi ,
    >>>
    >>> I have a program where I want to print a string
    >>> "457e31b2db200dc125f3e00886ff57de"
    >>> like "\x45\x7e\x31\xb2\xdb\x20\x0d\xc1\x25\xf3\xe0\x08\x86\xff\x57\xde"
    >>> . But in each and every case it is giving an error :

    >> [OP's code at EOM]
    >>
    >> #include <stdio.h>
    >>
    >> int main(void)
    >> {
    >> unsigned char mbBuf[] = "457e31b2db200dc125f3e00886ff57de";
    >> unsigned i, n = sizeof mbBuf - 1;
    >> for (i = 0; i < n; i += 2)
    >> printf("\\x%c%c", mbBuf, mbBuf[i + 1]);
    >> return 0;
    >> }

    >
    > It could not work.
    >
    > Missing:
    >
    > printf("\n"); /* :) */
    >
    > before
    >
    > return 0;


    Thanks for pointing out one of (at least) two errors in an extremely
    simple program. I shouldn't offer advice after being up three days.
     
    Martin Ambuhl, Jul 31, 2006
    #7
  8. "Giorgio Silvestri" <> writes:
    [...]
    > It could not work.
    >
    > Missing:
    >
    > printf("\n"); /* :) */
    >
    > before
    >
    > return 0;


    It could work. Whether a trailing '\n' is required for a text stream
    is implementation-defined.

    --
    Keith Thompson (The_Other_Keith) <http://www.ghoti.net/~kst>
    San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
    We must do something. This is something. Therefore, we must do this.
     
    Keith Thompson, Jul 31, 2006
    #8
  9. Guest

    Martin Ambuhl wrote:
    > Giorgio Silvestri wrote:
    > > "Martin Ambuhl" <> ha scritto nel messaggio
    > > news:...
    > >> wrote:
    > >>> Hi ,
    > >>>
    > >>> I have a program where I want to print a string
    > >>> "457e31b2db200dc125f3e00886ff57de"
    > >>> like "\x45\x7e\x31\xb2\xdb\x20\x0d\xc1\x25\xf3\xe0\x08\x86\xff\x57\xde"
    > >>> . But in each and every case it is giving an error :
    > >> [OP's code at EOM]
    > >>
    > >> #include <stdio.h>
    > >>
    > >> int main(void)
    > >> {
    > >> unsigned char mbBuf[] = "457e31b2db200dc125f3e00886ff57de";
    > >> unsigned i, n = sizeof mbBuf - 1;
    > >> for (i = 0; i < n; i += 2)
    > >> printf("\\x%c%c", mbBuf, mbBuf[i + 1]);
    > >> return 0;
    > >> }

    > >
    > > It could not work.
    > >
    > > Missing:
    > >
    > > printf("\n"); /* :) */
    > >
    > > before
    > >
    > > return 0;

    >
    > Thanks for pointing out one of (at least) two errors in an extremely
    > simple program. I shouldn't offer advice after being up three days.


    Thanks a lot to all of you . Although it solved the question i had
    asked .. But now i m stuck with another problem related to the query .

    Actually when i put a "\x" manually in front of every two digits in the
    string the string gets printed as "¦ñ²±Z˜-=§ßÉ¢Sp{¦"

    The code which prints these special characters is :

    int main(int argc, char* argv[])
    {
    char mbBuf[BUF_SIZE] =
    "\xb2\xa4\xfd\xf1\x5a\xf7\xc4\xf2\x15\xe1\x90\x9b\xe4\x70\x7b\xdb";

    printf("\nThe mbBuf string is %s\n",mbBuf);

    }

    but when i print the string "b2a4fdf15af7c4f215e1909be4707bdb" with
    the \x using the for loop it doesn't print those special chars :-(
     
    , Jul 31, 2006
    #9
  10. Keith Thompson said:

    > "Giorgio Silvestri" <> writes:
    > [...]
    >> It could not work.
    >>
    >> Missing:
    >>
    >> printf("\n"); /* :) */
    >>
    >> before
    >>
    >> return 0;

    >
    > It could work. Whether a trailing '\n' is required for a text stream
    > is implementation-defined.


    Yes, but I think this is a translation issue. It seems to me that maybe
    Giorgio probably meant "it might not work", perhaps.

    --
    Richard Heathfield
    "Usenet is a strange place" - dmr 29/7/1999
    http://www.cpax.org.uk
    email: rjh at above domain (but drop the www, obviously)
     
    Richard Heathfield, Jul 31, 2006
    #10
  11. "Richard Heathfield" <> ha scritto nel messaggio
    news:...
    > Keith Thompson said:
    >
    > > "Giorgio Silvestri" <> writes:
    > > [...]
    > >> It could not work.
    > >>
    > >> Missing:
    > >>
    > >> printf("\n"); /* :) */
    > >>
    > >> before
    > >>
    > >> return 0;

    > >
    > > It could work. Whether a trailing '\n' is required for a text stream
    > > is implementation-defined.

    >
    > Yes, but I think this is a translation issue. It seems to me that maybe
    > Giorgio probably meant "it might not work", perhaps.
    >


    Yes.


    --
    Giorgio Silvestri
    DSP/Embedded/Real Time OS (RTOS) Software Engineer
     
    Giorgio Silvestri, Jul 31, 2006
    #11
  12. <> ha scritto nel messaggio
    news:...
    Martin Ambuhl wrote:
    > Giorgio Silvestri wrote:
    > > "Martin Ambuhl" <> ha scritto nel messaggio
    > > news:...
    > >> wrote:


    >int main(int argc, char* argv[])
    >{
    > char mbBuf[BUF_SIZE] =
    >"\xb2\xa4\xfd\xf1\x5a\xf7\xc4\xf2\x15\xe1\x90\x9b\xe4\x70\x7b\xdb";
    >
    > printf("\nThe mbBuf string is %s\n",mbBuf);
    >
    >}



    BUF_SIZE ?

    if BUF_SIZE is equal to the value of
    strlen("\xb2\xa4\xfd\xf1\x5a\xf7\xc4\xf2\x15\xe1\x90\x9b\xe4\x70\x7b\xdb")

    then mbBuf is not '\0' terminated.


    char mbBuf[] =
    "\xb2\xa4\xfd\xf1\x5a\xf7\xc4\xf2\x15\xe1\x90\x9b\xe4\x70\x7b\xdb";


    --
    Giorgio Silvestri
    DSP/Embedded/Real Time OS (RTOS) Software Engineer
     
    Giorgio Silvestri, Jul 31, 2006
    #12
  13. Re: x used with no following hex digits

    In article <> writes:
    ....
    > unsigned char mbBuf[16] = "457e31b2db200dc125f3e00886ff57de";


    The string on the right is a bit long as initialiserf for the array
    on the left.
    --
    dik t. winter, cwi, kruislaan 413, 1098 sj amsterdam, nederland, +31205924131
    home: bovenover 215, 1025 jn amsterdam, nederland; http://www.cwi.nl/~dik/
     
    Dik T. Winter, Jul 31, 2006
    #13
  14. "Giorgio Silvestri" <> writes:
    > "Richard Heathfield" <> ha scritto nel messaggio
    > news:...
    >> Keith Thompson said:
    >> > "Giorgio Silvestri" <> writes:
    >> > [...]
    >> >> It could not work.

    [...]
    >> > It could work. Whether a trailing '\n' is required for a text stream
    >> > is implementation-defined.

    >>
    >> Yes, but I think this is a translation issue. It seems to me that maybe
    >> Giorgio probably meant "it might not work", perhaps.

    >
    > Yes.


    Ok. I read it as "It (could not) work", not as "It could (not work)",
    and I expect many others would read it the same way.

    --
    Keith Thompson (The_Other_Keith) <http://www.ghoti.net/~kst>
    San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
    We must do something. This is something. Therefore, we must do this.
     
    Keith Thompson, Jul 31, 2006
    #14
  15. On 31 Jul 2006 03:41:51 -0700, wrote:

    > Martin Ambuhl wrote:


    > > >>> I have a program where I want to print a string
    > > >>> "457e31b2db200dc125f3e00886ff57de"
    > > >>> like "\x45\x7e\x31\xb2\xdb\x20\x0d\xc1\x25\xf3\xe0\x08\x86\xff\x57\xde"

    <snip>
    > Thanks a lot to all of you . Although it solved the question i had
    > asked .. But now i m stuck with another problem related to the query .
    >
    > Actually when i put a "\x" manually in front of every two digits in the
    > string the string gets printed as "¦ñ²±Z˜-=§ßÉ¢Sp{¦"
    >
    > The code which prints these special characters is :
    >
    > int main(int argc, char* argv[])
    > {
    > char mbBuf[BUF_SIZE] =
    > "\xb2\xa4\xfd\xf1\x5a\xf7\xc4\xf2\x15\xe1\x90\x9b\xe4\x70\x7b\xdb";
    >
    > printf("\nThe mbBuf string is %s\n",mbBuf);
    >
    > }
    >
    > but when i print the string "b2a4fdf15af7c4f215e1909be4707bdb" with
    > the \x using the for loop it doesn't print those special chars :-(


    Aha. It sounds like what you meant is not "print so that the output is
    in the form \x45 ...", but "print the output you would get if you had
    \x45 in the source". These are not the same. Backslash escapes
    including \xXX in a string (or char) literal are converted _at compile
    time_ to the specified byte value(s). For example
    char mbBuf[N] = "\xb2\xa4";
    (given N is >= 3) should produce the same object/executable (and
    must produce the same runtime effect) as
    char mbBuf[N] = {0xb2, 0xa4, 0};
    or
    char mbBuf[N] = {178, 164, 0};

    If what you want is to extract values represented as two hex digits
    each in a string, and output those values, you must do the conversion
    explicitly, not expect \x to cause it to happen for you:

    char xx [] = "457e"; /* etc. */
    int i, x; /* in general i might better be size_t */
    for( i = 0; xx /* && xx[i+1] */; i += 2 ){
    /* or i < strlen(xx) or with array visible i < sizeof xx - 1 */
    #if ONEWAY
    sscanf (xx+i, "%2x", &x);
    /* in general should check return value from sscanf for error(s)
    but here I assume input data is always good and don't bother */
    #elif ANOTHERWAY
    char yy [3] = {0};
    memcpy (yy, xx+i, 2); /* extract 2 digits plus null terminator */
    x = /* (int) */ strtol (yy, NULL, 16);
    #elif EXPLICITWAY
    x = getdig (yy) * 16U + getdig (yy[i+1);
    #endif
    putchar (x); /* for stdout, or fputc (x, fp); */
    /* or have a second buffer and copy the converted bytes into it
    then fwrite or if applicable fputs or puts the whole buffer */
    }

    where int getdig (char d)
    can be for ASCII something like
    return isdigit(d)? d-'0': toupper(d)-'A'+10;
    or for complete portability something like
    const char digitlist [] = "0123456789ABCDEF";
    return strchr (digitlist, d) - digitlist;
    in each case with addition of error checks and handling
    if your input data is not guaranteed good or already checked.

    - David.Thompson1 at worldnet.att.net
     
    Dave Thompson, Aug 14, 2006
    #15
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. aefxx
    Replies:
    1
    Views:
    621
    Virgil Green
    Dec 17, 2004
  2. Replies:
    10
    Views:
    6,397
    Neredbojias
    Aug 19, 2005
  3. Magix

    4 digits hex (WORD)

    Magix, Jun 14, 2004, in forum: C Programming
    Replies:
    2
    Views:
    528
    Magix
    Jun 15, 2004
  4. Bengt Richter
    Replies:
    6
    Views:
    527
    Juha Autero
    Aug 19, 2003
  5. Hex digits to special chars

    , Aug 1, 2006, in forum: C Programming
    Replies:
    8
    Views:
    341
    Herbert Rosenau
    Aug 4, 2006
Loading...

Share This Page