-1

I wrote a simple program to read a packet till layer 3 and print the same in hex format. I gave input in hex format. My output should be same as this.

Input:

45 00 00 44 ad 0b 00 00 40 11 72 72 ac 14 02 fd ac 14  
00 06 e5 87 00 35 00 30 5b 6d ab c9 01 00 00 01  
00 00 00 00 00 00 09 6d 63 63 6c 65 6c 6c 61 6e  
02 63 73 05 6d 69 61 6d 69 03 65 64 75 00 00 01  
00 01 

I am able to read the packet. Here the hex dump in gdb

(gdb) p packet
$1 = 0x603240 "E"
(gdb) x/32x 0x603240
0x603240:       0x00440045      0x00000000      0x00400b0e      0x00000000
0x603250:       0x00603010      0x0035e587      0xe3200030      0x63206261
0x603260:       0x31302039      0x20303020      0x30203030      0x30302031
0x603270:       0x20303020      0x30203030      0x30302030      0x20303020
0x603280:       0x36203930      0x33362064      0x20333620      0x36206336
0x603290:       0x63362035      0x20633620      0x36203136      0x32302065
0x6032a0:       0x20333620      0x30203337      0x64362035      0x20393620
0x6032b0:       0x36203136      0x39362064      0x20333020      0x36203536

But when I tried to print the packet in console using %s I can't see the total packet because of zeros in between. But I wanted to print it till length of the packet(I am taking it as input to print function).

output on console is:

packet: E

My print function is something like this.

void print(char *packet, int len) {
    printf("packet: ");
    printf("%s\n\n" , packet );
}

Can you tell me any other way to print the packet till the len(input to print function).

PS: Reading l3 information I didn,t complete. So in gdb of packet l3 information vary form my input.

satyaGolladi
  • 180
  • 13

1 Answers1

1

A string in C is defined as a sequence of characters ending with '\0' (a 0-byte), and the %s conversion specifier of printf() is for strings. So the solution to your problem is doing something else for printing the binary bytes. If you want for example to print their hexadecimal values, you could change your print function like this:

void print(unsigned char *packet, size_t len)
{
    for (size_t i = 0; i < len; ++i) printf("%02hhx ", packet[i]);
    puts("");
}

Note I also changed the types here:

  • char can be signed. If you want to handle raw bytes, it's better to always use unsigned char.
  • int might be too small for a size, always use size_t which is guaranteed to hold any size possible on your platform.

If you really want to print encoded characters (which is unlikely with binary data), you can use %c in printf(), or use the putchar() function, or fwrite() the whole chunk to stdout.