\x used with no following hex digits

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

  1. abhi147

    abhi147 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 !!
     
    abhi147, Jul 31, 2006
    #1
    1. Advertisements



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

    When you want a \ to appear in the output string, you have to
    escape the \ by doubling it.
     
    Walter Roberson, Jul 31, 2006
    #2
    1. Advertisements

  3. [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]
     
    Martin Ambuhl, Jul 31, 2006
    #3


  4. Wrong code. You don't print mbBuf.

    #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, Jul 31, 2006
    #4
  5. ^^^
    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
     
    Martin Ambuhl, Jul 31, 2006
    #5


  6. It could not work.

    Missing:

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

    before

    return 0;
     
    Giorgio Silvestri, Jul 31, 2006
    #6


  7. 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. It could work. Whether a trailing '\n' is required for a text stream
    is implementation-defined.
     
    Keith Thompson, Jul 31, 2006
    #8
  9. abhi147

    abhi147 Guest



    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 :-(
     
    abhi147, Jul 31, 2006
    #9
  10. Keith Thompson said:
    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, Jul 31, 2006
    #10
  11. Yes.
     
    Giorgio Silvestri, Jul 31, 2006
    #11
  12. <> ha scritto nel messaggio

    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, Jul 31, 2006
    #12
  13. The string on the right is a bit long as initialiserf for the array
    on the left.
     
    Dik T. Winter, Jul 31, 2006
    #13
  14. 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, Jul 31, 2006
    #14
  15. 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. Advertisements

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.