\x used with no following hex digits

A

abhi147

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 !!
 
W

Walter Roberson

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.
 
M

Martin Ambuhl

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);
}
 
G

Giorgio Silvestri

Walter Roberson said:
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;
}
 
M

Martin Ambuhl

Martin said:
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
said:
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); }
 
G

Giorgio Silvestri

Martin Ambuhl said:
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;
 
M

Martin Ambuhl

Giorgio said:
Martin Ambuhl said:
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.
 
K

Keith Thompson

Giorgio Silvestri said:
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.
 
A

abhi147

Martin said:
Giorgio said:
Martin Ambuhl said:
(e-mail address removed) 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 :-(
 
R

Richard Heathfield

Keith Thompson said:
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.
 
G

Giorgio Silvestri

Richard Heathfield said:
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.

Yes.
 
G

Giorgio Silvestri

<[email protected]> ha scritto nel messaggio
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";
 
K

Keith Thompson

Giorgio Silvestri said:
Richard Heathfield said:
Keith Thompson said:
[...]
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.
 
D

Dave Thompson

Martin Ambuhl wrote:
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
 

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. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,756
Messages
2,569,540
Members
45,025
Latest member
KetoRushACVFitness

Latest Threads

Top