The following is one of several sample programs illustrating
the use of Szip compression in HDF4.
The entire set can be found
in the subdirectory h4_examples/.
/* This program writes and reads 16-bit integer data using SZIP compression */
#include <hdf.h>
#include <szlib.h>
#define FILE_NAME16 "SDS_16_sziped.hdf"
#define SDS_NAME "SzipedData"
#define RANK 2
#define WIDTH 6
#define LENGTH 9
int main()
{
/************************* Variable declaration **************************/
int32 sd_id, sds_id;
intn status;
int32 dim_sizes[2], array_rank, num_type, attributes;
char name[MAX_NC_NAME];
comp_info c_info;
int32 start[2], edges[2];
int16 fill_value = 0; /* Fill value */
int i,j;
int num_errs = 0; /* number of errors so far */
int16 out_data[LENGTH][WIDTH];
int16 in_data[LENGTH][WIDTH] = {
100,100,200,200,300,400,
100,100,200,200,300,400,
100,100,200,200,300,400,
300,300, 0,400,300,400,
300,300, 0,400,300,400,
300,300, 0,400,300,400,
0, 0,600,600,300,400,
500,500,600,600,300,400,
0, 0,600,600,300,400};
/********************* End of variable declaration ***********************/
/* Create the file and initialize SD interface */
sd_id = SDstart (FILE_NAME16, DFACC_CREATE);
/* Create the SDS */
dim_sizes[0] = LENGTH;
dim_sizes[1] = WIDTH;
sds_id = SDcreate (sd_id, SDS_NAME, DFNT_INT16, RANK, dim_sizes);
/* Define the location, pattern, and size of the data set */
for (i = 0; i < RANK; i++) {
start[i] = 0;
edges[i] = dim_sizes[i];
}
/* Fill the SDS array with the fill value */
status = SDsetfillvalue (sds_id, (VOIDP)&fill_value);
/* Initialize parameters for SZIP */
/* other parameters are automatically set by HDF */
c_info.szip.pixels_per_block = 2; /* even number from 2-32 */
c_info.szip.options_mask = SZ_NN_OPTION_MASK; /* or SZ_EC_OPTION_MASK */
c_info.szip.options_mask |= SZ_RAW_OPTION_MASK;
/* Set the compression */
status = SDsetcompress (sds_id, COMP_CODE_SZIP, &c_info);
/* Write data to the SDS */
status = SDwritedata(sds_id, start, NULL, edges, (VOIDP)in_data);
/* Terminate access to the data set */
status = SDendaccess (sds_id);
/* Terminate access to the SD interface and close the file to
flush the compressed info to the file */
status = SDend (sd_id);
/*
* Verify the compressed data
*/
/* Reopen the file and select the first SDS */
sd_id = SDstart (FILE_NAME16, DFACC_READ);
sds_id = SDselect (sd_id, 0);
/* Wipe out the output buffer */
memset(&out_data, 0, sizeof(out_data));
/* Read the data set */
start[0] = 0;
start[1] = 0;
edges[0] = LENGTH;
edges[1] = WIDTH;
status = SDreaddata (sds_id, start, NULL, edges, (VOIDP)out_data);
/* Compare read data against input data */
for (j = 0; j < LENGTH; j++)
{
for (i = 0; i < WIDTH; i++)
if (out_data[j][i] != in_data[j][i])
{
fprintf(stderr, "Bogus val in loc [%d][%d] in compressed dset, want %ld got %ld\n", j, i, (long)in_data[j][i], (long)out_data[j][i]);
num_errs++;
}
}
/* Terminate access to the data set */
status = SDendaccess (sds_id);
/* Terminate access to the SD interface and close the file */
status = SDend (sd_id);
/* Return the number of errors that's been kept track of so far */
return 0;
}