igtl_uint64 igtl_export igtl_string_get_crc(igtl_string_header * header, void* string) { igtl_uint64 crc; igtl_uint64 string_length; /* convert byte order to get string length */ igtl_string_convert_byte_order(header); string_length = (igtl_uint32)(header->length); igtl_string_convert_byte_order(header); crc = crc64(0, 0, 0); crc = crc64((unsigned char*) header, IGTL_STRING_HEADER_SIZE, crc); crc = crc64((unsigned char*) string, (int)string_length, crc); return crc; }
int main( int argc, char * argv [] ) { struct string_message message; /*igtl_uint64 crc;*/ int r; int s; // Test structure size if (sizeof(message) != IGTL_HEADER_SIZE+IGTL_STRING_HEADER_SIZE+IGTL_STRING_TEST_STRING_LEN) { fprintf(stdout, "Invalid size of image message structure.\n"); return EXIT_FAILURE; } /* Set dummy string header and values */ message.string_header.encoding = 3; message.string_header.length = IGTL_STRING_TEST_STRING_LEN; strncpy((char*)message.string, IGTL_STRING_TEST_STRING, IGTL_STRING_TEST_STRING_LEN); igtl_string_convert_byte_order(&(message.string_header)); /* Set header */ message.header.version = 1; strncpy( (char*)&(message.header.name), "STRING", 12 ); strncpy( (char*)&(message.header.device_name), "DeviceName", 20 ); message.header.timestamp = 1234567892; message.header.body_size = IGTL_STRING_HEADER_SIZE + IGTL_STRING_TEST_STRING_LEN; message.header.crc = igtl_string_get_crc(&(message.string_header), (void*) message.string); igtl_header_convert_byte_order( &(message.header) ); /* Dumping data -- for testing */ /* FILE *fp; fp = fopen("string.bin", "w"); fwrite(&(message.header), IGTL_HEADER_SIZE+IGTL_STRING_HEADER_SIZE + IGTL_STRING_TEST_STRING_LEN, 1, fp); fclose(fp); */ /* Compare the serialized byte array with the gold standard */ r = memcmp((const void*)&message, (const void*)test_string_message, IGTL_HEADER_SIZE+IGTL_STRING_HEADER_SIZE+IGTL_STRING_TEST_STRING_LEN); if (r == 0) { return EXIT_SUCCESS; } else { /* Print first 256 bytes as HEX values in STDERR for debug */ s = IGTL_HEADER_SIZE+IGTL_STRING_HEADER_SIZE+IGTL_STRING_TEST_STRING_LEN; if (s > 256) { s = 256; } fprintf(stdout, "\n===== First %d bytes of the test message =====\n", s); igtl_message_dump_hex(stdout, (const void*)&message, s); return EXIT_FAILURE; } }