I am trying to read a binary file datafile
in C. This binary file apparently contains 32-bit (4-byte) integers. I am told that the binary file was generated using the following code snippet:
#include <fcntl.h>
#include <stdint.h>
#include <unistd.h>
.....
int fd = open("datafile", O_CREAT|O_WRONLY, 0600);
if(fd >= 0) { // IFF FILE OPENED SUCCESSFULLY
for(int32_t i = -50 ; i<50 ; i++) {
write(fd, &i, sizeof(i));
}
close(fd);
}
I was given the following code for reading the binary file:
#include <stdio.h>
#include <fcntl.h>
#include <stdint.h>
#include <unistd.h>
int main(void) {
int fd = open("datafile", O_RDONLY, 0);
if(fd >= 0) {
for(int32_t i = -50; i < 50; i++) {
int32_t value;
read(fd, &value, sizeof(value));
printf("%4i\t0x%08x\t%10i\t0x%08x\n", i, i, value, value);
}
close(fd);
}
return 0;
}
I am told that this code should print the values of the binary file as both decimal and hexadecimal values. My output is as follows:
-50 0xffffffce 255 0x000000ff
-49 0xffffffcf 255 0x000000ff
-48 0xffffffd0 255 0x000000ff
-47 0xffffffd1 255 0x000000ff
-46 0xffffffd2 255 0x000000ff
-45 0xffffffd3 255 0x000000ff
-44 0xffffffd4 255 0x000000ff
-43 0xffffffd5 255 0x000000ff
-42 0xffffffd6 255 0x000000ff
-41 0xffffffd7 255 0x000000ff
-40 0xffffffd8 255 0x000000ff
-39 0xffffffd9 255 0x000000ff
-38 0xffffffda 255 0x000000ff
-37 0xffffffdb 255 0x000000ff
-36 0xffffffdc 255 0x000000ff
-35 0xffffffdd 255 0x000000ff
-34 0xffffffde 255 0x000000ff
-33 0xffffffdf 255 0x000000ff
-32 0xffffffe0 255 0x000000ff
-31 0xffffffe1 255 0x000000ff
-30 0xffffffe2 255 0x000000ff
-29 0xffffffe3 255 0x000000ff
-28 0xffffffe4 255 0x000000ff
-27 0xffffffe5 255 0x000000ff
-26 0xffffffe6 255 0x000000ff
-25 0xffffffe7 255 0x000000ff
-24 0xffffffe8 255 0x000000ff
-23 0xffffffe9 255 0x000000ff
-22 0xffffffea 255 0x000000ff
-21 0xffffffeb 255 0x000000ff
-20 0xffffffec 255 0x000000ff
-19 0xffffffed 255 0x000000ff
-18 0xffffffee 255 0x000000ff
-17 0xffffffef 255 0x000000ff
-16 0xfffffff0 255 0x000000ff
-15 0xfffffff1 255 0x000000ff
-14 0xfffffff2 255 0x000000ff
-13 0xfffffff3 255 0x000000ff
-12 0xfffffff4 255 0x000000ff
-11 0xfffffff5 255 0x000000ff
-10 0xfffffff6 255 0x000000ff
-9 0xfffffff7 255 0x000000ff
-8 0xfffffff8 255 0x000000ff
-7 0xfffffff9 255 0x000000ff
-6 0xfffffffa 255 0x000000ff
-5 0xfffffffb 255 0x000000ff
-4 0xfffffffc 255 0x000000ff
-3 0xfffffffd 255 0x000000ff
-2 0xfffffffe 255 0x000000ff
-1 0xffffffff 255 0x000000ff
0 0x00000000 255 0x000000ff
1 0x00000001 255 0x000000ff
2 0x00000002 255 0x000000ff
3 0x00000003 255 0x000000ff
4 0x00000004 255 0x000000ff
5 0x00000005 255 0x000000ff
6 0x00000006 255 0x000000ff
7 0x00000007 255 0x000000ff
8 0x00000008 255 0x000000ff
9 0x00000009 255 0x000000ff
10 0x0000000a 255 0x000000ff
11 0x0000000b 255 0x000000ff
12 0x0000000c 255 0x000000ff
13 0x0000000d 255 0x000000ff
14 0x0000000e 255 0x000000ff
15 0x0000000f 255 0x000000ff
16 0x00000010 255 0x000000ff
17 0x00000011 255 0x000000ff
18 0x00000012 255 0x000000ff
19 0x00000013 255 0x000000ff
20 0x00000014 255 0x000000ff
21 0x00000015 255 0x000000ff
22 0x00000016 255 0x000000ff
23 0x00000017 255 0x000000ff
24 0x00000018 255 0x000000ff
25 0x00000019 255 0x000000ff
26 0x0000001a 255 0x000000ff
27 0x0000001b 255 0x000000ff
28 0x0000001c 255 0x000000ff
29 0x0000001d 255 0x000000ff
30 0x0000001e 255 0x000000ff
31 0x0000001f 255 0x000000ff
32 0x00000020 255 0x000000ff
33 0x00000021 255 0x000000ff
34 0x00000022 255 0x000000ff
35 0x00000023 255 0x000000ff
36 0x00000024 255 0x000000ff
37 0x00000025 255 0x000000ff
38 0x00000026 255 0x000000ff
39 0x00000027 255 0x000000ff
40 0x00000028 255 0x000000ff
41 0x00000029 255 0x000000ff
42 0x0000002a 255 0x000000ff
43 0x0000002b 255 0x000000ff
44 0x0000002c 255 0x000000ff
45 0x0000002d 255 0x000000ff
46 0x0000002e 255 0x000000ff
47 0x0000002f 255 0x000000ff
48 0x00000030 255 0x000000ff
49 0x00000031 255 0x000000ff
But the output should actually be as follows:
-50 0xffffffce -822083585 0xceffffff
-49 0xffffffcf -805306369 0xcfffffff
-48 0xffffffd0 -788529153 0xd0ffffff
.....
-3 0xfffffffd -33554433 0xfdffffff
-2 0xfffffffe -16777217 0xfeffffff
-1 0xffffffff -1 0xffffffff
0 0x00000000 0 0x00000000
1 0x00000001 16777216 0x01000000
2 0x00000002 33554432 0x02000000
3 0x00000003 50331648 0x03000000
.....
47 0x0000002f 788529152 0x2f000000
48 0x00000030 805306368 0x30000000
49 0x00000031 822083584 0x31000000
As you can see, even though my first two columns seem to be as expected, the that last two columns are completely different to what they should be. My last two columns just print out the same two values of 255
and 0x000000ff
repeatedly. What's going on here, and how can I fix it?