26 b0 = (n & 0x000000ff) << 24u;
27 b1 = (n & 0x0000ff00) << 8u;
28 b2 = (n & 0x00ff0000) >> 8u;
29 b3 = (n & 0xff000000) >> 24u;
31 return (b0 | b1 | b2 | b3);
56 fread(&ifh->
imgWidth, 4, 1, imageFile);
96 imageFile = fopen (fileName,
"rb");
97 if (imageFile == NULL) {
98 printf(
"Abort! Could not fine MNIST IMAGE file: %s\n",fileName);
120 labelFile = fopen (fileName,
"rb");
121 if (labelFile == NULL) {
122 printf(
"Abort! Could not find MNIST LABEL file: %s\n",fileName);
143 result = fread(&img,
sizeof(img), 1, imageFile);
145 printf(
"\nError when reading IMAGE file! Abort!\n");
163 result = fread(&lbl,
sizeof(lbl), 1, labelFile);
165 printf(
"\nError when reading LABEL file! Abort!\n");
180 char numStr[(28*28)+1];
185 strcpy(numStr,
"............................");
186 strcat(numStr,
"............................");
187 strcat(numStr,
"............................");
188 strcat(numStr,
"............................");
189 strcat(numStr,
"............XXXX............");
190 strcat(numStr,
"............XXXX............");
191 strcat(numStr,
"............XXXX............");
192 strcat(numStr,
"............XXXX............");
193 strcat(numStr,
"............XXXX............");
194 strcat(numStr,
"............XXXX............");
195 strcat(numStr,
"............XXXX............");
196 strcat(numStr,
"............XXXX............");
197 strcat(numStr,
"............XXXX............");
198 strcat(numStr,
"............XXXX............");
199 strcat(numStr,
"............XXXX............");
200 strcat(numStr,
"............XXXX............");
201 strcat(numStr,
"............XXXX............");
202 strcat(numStr,
"............XXXX............");
203 strcat(numStr,
"............XXXX............");
204 strcat(numStr,
"............XXXX............");
205 strcat(numStr,
"............XXXX............");
206 strcat(numStr,
"............XXXX............");
207 strcat(numStr,
"............XXXX............");
208 strcat(numStr,
"............XXXX............");
209 strcat(numStr,
"............................");
210 strcat(numStr,
"............................");
211 strcat(numStr,
"............................");
212 strcat(numStr,
"............................");
216 strcpy(numStr,
"............................");
217 strcat(numStr,
"............................");
218 strcat(numStr,
"............................");
219 strcat(numStr,
"............................");
220 strcat(numStr,
".....XXXXXXXXXXXXXXXXXX.....");
221 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
222 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
223 strcat(numStr,
".....XXXXXXXXXXXXXXXXXXX....");
224 strcat(numStr,
"...................XXXXX....");
225 strcat(numStr,
"....................XXXX....");
226 strcat(numStr,
"....................XXXX....");
227 strcat(numStr,
"...................XXXXX....");
228 strcat(numStr,
".....XXXXXXXXXXXXXXXXXXX....");
229 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
230 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
231 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXX.....");
232 strcat(numStr,
"....XXXXX...................");
233 strcat(numStr,
"....XXXX....................");
234 strcat(numStr,
"....XXXX....................");
235 strcat(numStr,
"....XXXXX...................");
236 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXX.....");
237 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
238 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
239 strcat(numStr,
".....XXXXXXXXXXXXXXXXXX.....");
240 strcat(numStr,
"............................");
241 strcat(numStr,
"............................");
242 strcat(numStr,
"............................");
243 strcat(numStr,
"............................");
247 strcpy(numStr,
"............................");
248 strcat(numStr,
"............................");
249 strcat(numStr,
"............................");
250 strcat(numStr,
"............................");
251 strcat(numStr,
".....XXXXXXXXXXXXXXXXXX.....");
252 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
253 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
254 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
255 strcat(numStr,
"...................XXXXX....");
256 strcat(numStr,
"....................XXXX....");
257 strcat(numStr,
"....................XXXX....");
258 strcat(numStr,
"...................XXXXX....");
259 strcat(numStr,
".....XXXXXXXXXXXXXXXXXXX....");
260 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
261 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
262 strcat(numStr,
".....XXXXXXXXXXXXXXXXXXX....");
263 strcat(numStr,
"...................XXXXX....");
264 strcat(numStr,
"....................XXXX....");
265 strcat(numStr,
"....................XXXX....");
266 strcat(numStr,
"...................XXXXX....");
267 strcat(numStr,
".....XXXXXXXXXXXXXXXXXXX....");
268 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
269 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
270 strcat(numStr,
".....XXXXXXXXXXXXXXXXXX.....");
271 strcat(numStr,
"............................");
272 strcat(numStr,
"............................");
273 strcat(numStr,
"............................");
274 strcat(numStr,
"............................");
278 strcpy(numStr,
"............................");
279 strcat(numStr,
"............................");
280 strcat(numStr,
"............................");
281 strcat(numStr,
"............................");
282 strcat(numStr,
"....XXXX....................");
283 strcat(numStr,
"....XXXX....................");
284 strcat(numStr,
"....XXXX....................");
285 strcat(numStr,
"....XXXX....................");
286 strcat(numStr,
"....XXXX.......XXXX.........");
287 strcat(numStr,
"....XXXX.......XXXX.........");
288 strcat(numStr,
"....XXXX.......XXXX.........");
289 strcat(numStr,
"....XXXXX......XXXX.........");
290 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXX.....");
291 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
292 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
293 strcat(numStr,
".....XXXXXXXXXXXXXXXXXX.....");
294 strcat(numStr,
"...............XXXX.........");
295 strcat(numStr,
"...............XXXX.........");
296 strcat(numStr,
"...............XXXX.........");
297 strcat(numStr,
"...............XXXX.........");
298 strcat(numStr,
"...............XXXX.........");
299 strcat(numStr,
"...............XXXX.........");
300 strcat(numStr,
"...............XXXX.........");
301 strcat(numStr,
"...............XXXX.........");
302 strcat(numStr,
"............................");
303 strcat(numStr,
"............................");
304 strcat(numStr,
"............................");
305 strcat(numStr,
"............................");
309 strcpy(numStr,
"............................");
310 strcat(numStr,
"............................");
311 strcat(numStr,
"............................");
312 strcat(numStr,
"............................");
313 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXX.....");
314 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
315 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
316 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
317 strcat(numStr,
"....XXXX....................");
318 strcat(numStr,
"....XXXX....................");
319 strcat(numStr,
"....XXXX....................");
320 strcat(numStr,
"....XXXX....................");
321 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXX.....");
322 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
323 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
324 strcat(numStr,
".....XXXXXXXXXXXXXXXXXXX....");
325 strcat(numStr,
"...................XXXXX....");
326 strcat(numStr,
"....................XXXX....");
327 strcat(numStr,
"....................XXXX....");
328 strcat(numStr,
"...................XXXXX....");
329 strcat(numStr,
".....XXXXXXXXXXXXXXXXXXX....");
330 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
331 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
332 strcat(numStr,
".....XXXXXXXXXXXXXXXXXX.....");
333 strcat(numStr,
"............................");
334 strcat(numStr,
"............................");
335 strcat(numStr,
"............................");
336 strcat(numStr,
"............................");
340 strcpy(numStr,
"............................");
341 strcat(numStr,
"............................");
342 strcat(numStr,
"............................");
343 strcat(numStr,
"............................");
344 strcat(numStr,
".....XXXXXXXXXXXXXXXXXX.....");
345 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
346 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
347 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXX.....");
348 strcat(numStr,
"....XXXXX...................");
349 strcat(numStr,
"....XXXX....................");
350 strcat(numStr,
"....XXXX....................");
351 strcat(numStr,
"....XXXXX...................");
352 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXX.....");
353 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
354 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
355 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
356 strcat(numStr,
"....XXXXX..........XXXXX....");
357 strcat(numStr,
"....XXXX............XXXX....");
358 strcat(numStr,
"....XXXX............XXXX....");
359 strcat(numStr,
"....XXXXX..........XXXXX....");
360 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
361 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
362 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
363 strcat(numStr,
".....XXXXXXXXXXXXXXXXXX.....");
364 strcat(numStr,
"............................");
365 strcat(numStr,
"............................");
366 strcat(numStr,
"............................");
367 strcat(numStr,
"............................");
371 strcpy(numStr,
"............................");
372 strcat(numStr,
"............................");
373 strcat(numStr,
"............................");
374 strcat(numStr,
"............................");
375 strcat(numStr,
".....XXXXXXXXXXXXXXXXXXX....");
376 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
377 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
378 strcat(numStr,
".....XXXXXXXXXXXXXXXXXXX....");
379 strcat(numStr,
"...................XXXXX....");
380 strcat(numStr,
"....................XXXX....");
381 strcat(numStr,
"....................XXXX....");
382 strcat(numStr,
"....................XXXX....");
383 strcat(numStr,
"....................XXXX....");
384 strcat(numStr,
"....................XXXX....");
385 strcat(numStr,
"....................XXXX....");
386 strcat(numStr,
"....................XXXX....");
387 strcat(numStr,
"....................XXXX....");
388 strcat(numStr,
"....................XXXX....");
389 strcat(numStr,
"....................XXXX....");
390 strcat(numStr,
"....................XXXX....");
391 strcat(numStr,
"....................XXXX....");
392 strcat(numStr,
"....................XXXX....");
393 strcat(numStr,
"....................XXXX....");
394 strcat(numStr,
"....................XXXX....");
395 strcat(numStr,
"............................");
396 strcat(numStr,
"............................");
397 strcat(numStr,
"............................");
398 strcat(numStr,
"............................");
402 strcpy(numStr,
"............................");
403 strcat(numStr,
"............................");
404 strcat(numStr,
"............................");
405 strcat(numStr,
"............................");
406 strcat(numStr,
".....XXXXXXXXXXXXXXXXXX.....");
407 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
408 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
409 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
410 strcat(numStr,
"....XXXXX..........XXXXX....");
411 strcat(numStr,
"....XXXX............XXXX....");
412 strcat(numStr,
"....XXXX............XXXX....");
413 strcat(numStr,
"....XXXXX..........XXXXX....");
414 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
415 strcat(numStr,
".....XXXXXXXXXXXXXXXXXX.....");
416 strcat(numStr,
".....XXXXXXXXXXXXXXXXXX.....");
417 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
418 strcat(numStr,
"....XXXXX..........XXXXX....");
419 strcat(numStr,
"....XXXX............XXXX....");
420 strcat(numStr,
"....XXXX............XXXX....");
421 strcat(numStr,
"....XXXXX..........XXXXX....");
422 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
423 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
424 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
425 strcat(numStr,
".....XXXXXXXXXXXXXXXXXX.....");
426 strcat(numStr,
"............................");
427 strcat(numStr,
"............................");
428 strcat(numStr,
"............................");
429 strcat(numStr,
"............................");
433 strcpy(numStr,
"............................");
434 strcat(numStr,
"............................");
435 strcat(numStr,
"............................");
436 strcat(numStr,
"............................");
437 strcat(numStr,
".....XXXXXXXXXXXXXXXXXX.....");
438 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
439 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
440 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
441 strcat(numStr,
"....XXXXX..........XXXXX....");
442 strcat(numStr,
"....XXXX............XXXX....");
443 strcat(numStr,
"....XXXX............XXXX....");
444 strcat(numStr,
"....XXXXX..........XXXXX....");
445 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
446 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
447 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
448 strcat(numStr,
".....XXXXXXXXXXXXXXXXXXX....");
449 strcat(numStr,
"...................XXXXX....");
450 strcat(numStr,
"....................XXXX....");
451 strcat(numStr,
"....................XXXX....");
452 strcat(numStr,
"...................XXXXX....");
453 strcat(numStr,
".....XXXXXXXXXXXXXXXXXXX....");
454 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
455 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
456 strcat(numStr,
".....XXXXXXXXXXXXXXXXXX.....");
457 strcat(numStr,
"............................");
458 strcat(numStr,
"............................");
459 strcat(numStr,
"............................");
460 strcat(numStr,
"............................");
465 strcpy(numStr,
"............................");
466 strcat(numStr,
"............................");
467 strcat(numStr,
"............................");
468 strcat(numStr,
"............................");
469 strcat(numStr,
".....XXXXXXXXXXXXXXXXXX.....");
470 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
471 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
472 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
473 strcat(numStr,
"....XXXXX..........XXXXX....");
474 strcat(numStr,
"....XXXX............XXXX....");
475 strcat(numStr,
"....XXXX............XXXX....");
476 strcat(numStr,
"....XXXX............XXXX....");
477 strcat(numStr,
"....XXXX............XXXX....");
478 strcat(numStr,
"....XXXX............XXXX....");
479 strcat(numStr,
"....XXXX............XXXX....");
480 strcat(numStr,
"....XXXX............XXXX....");
481 strcat(numStr,
"....XXXX............XXXX....");
482 strcat(numStr,
"....XXXX............XXXX....");
483 strcat(numStr,
"....XXXX............XXXX....");
484 strcat(numStr,
"....XXXXX..........XXXXX....");
485 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
486 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
487 strcat(numStr,
"....XXXXXXXXXXXXXXXXXXXX....");
488 strcat(numStr,
".....XXXXXXXXXXXXXXXXXX.....");
489 strcat(numStr,
"............................");
490 strcat(numStr,
"............................");
491 strcat(numStr,
"............................");
492 strcat(numStr,
"............................");
497 return (numStr[pixelId]==
'X')?1:0;
FILE * openMNISTImageFile(char *fileName)
Read MNIST IMAGE file header.
FILE * openMNISTLabelFile(char *fileName)
Read MNIST label file header.
MNIST_Label getLabel(FILE *labelFile)
Returns the next label in given MNIST label file.
uint32_t flipBytes(uint32_t n)
void readImageFileHeader(FILE *imageFile, MNIST_ImageFileHeader *ifh)
Utitlies for handling the MNIST files.
MNIST_Image getImage(FILE *imageFile)
Returns the next image in given MNIST image file.
int getStandardDigitPixel(int num, int pixelId)
Data block defining a MNIST image.
void readLabelFileHeader(FILE *imageFile, MNIST_LabelFileHeader *lfh)