Loading...
Searching...
No Matches
gbits.c
Go to the documentation of this file.
#include "grib2_int.h"
void
gbit(unsigned char *in, g2int *iout, g2int iskip, g2int nbits)
{
gbits(in, iout, iskip, nbits, (g2int)0, (g2int)1);
}
void
sbit(unsigned char *out, g2int *in, g2int iskip, g2int nbits)
{
sbits(out, in, iskip, nbits, (g2int)0, (g2int)1);
}
void
gbits(unsigned char *in, g2int *iout, g2int iskip, g2int nbits,
g2int nskip, g2int n)
{
g2int i, tbit, bitcnt, ibit, itmp;
g2int nbit, index;
static g2int ones[] = {1, 3, 7, 15, 31, 63, 127, 255};
/* nbit is the start position of the field in bits */
nbit = iskip;
for (i = 0; i < n; i++)
{
bitcnt = nbits;
index = nbit / 8;
ibit = nbit % 8;
nbit = nbit + nbits + nskip;
/* first byte */
tbit = (bitcnt < (8 - ibit)) ? bitcnt : 8 - ibit; // find min
itmp = (int)*(in + index) & ones[7 - ibit];
if (tbit != 8 - ibit)
itmp >>= (8 - ibit - tbit);
index++;
bitcnt = bitcnt - tbit;
/* now transfer whole bytes */
while (bitcnt >= 8)
{
itmp = itmp << 8 | (int)*(in + index);
bitcnt = bitcnt - 8;
index++;
}
/* get data from last byte */
if (bitcnt > 0)
{
itmp = (itmp << bitcnt) |
(((int)*(in + index) >> (8 - bitcnt)) & ones[bitcnt - 1]);
}
iout[i] = itmp;
}
}
void
g2c_gbit_int(unsigned char *in, int *iout, int iskip, int nbits)
{
g2c_gbits_int(in, iout, iskip, nbits, 0, 1);
}
int
g2c_gbits_int(unsigned char *in, int *iout, int iskip, int nbits,
int nskip, int n)
{
g2int *g2iout;
int i;
/* The in parameter is required. */
if (!in)
return G2C_EINVAL;
/* Get some memory for results. */
if (!(g2iout = malloc(n * sizeof(g2int))))
return G2C_ENOMEM;
gbits(in, g2iout, iskip, nbits, nskip, n);
/* Copy from g2int to int. */
for (i = 0; i < n; i++)
iout[i] = (int)g2iout[i];
/* Free memory. */
free(g2iout);
return G2C_NOERROR;
}
void
sbits(unsigned char *out, g2int *in, g2int iskip, g2int nbits,
g2int nskip, g2int n)
{
g2int i, bitcnt, tbit, ibit, itmp, imask, itmp2, itmp3;
g2int nbit, index;
static g2int ones[] = {1, 3, 7, 15, 31, 63, 127, 255};
/* number bits from zero to ... nbit is the last bit of the field
* to be filled. */
nbit = iskip + nbits - 1;
for (i = 0; i < n; i++)
{
itmp = *(in + i);
bitcnt = nbits;
index = nbit / 8;
ibit = nbit % 8;
nbit = nbit + nbits + nskip;
/* make byte aligned */
if (ibit != 7)
{
tbit = (bitcnt < (ibit + 1)) ? bitcnt : ibit + 1; /* find min */
imask = ones[tbit - 1] << (7 - ibit);
itmp2 = (itmp << (7 - ibit)) & imask;
itmp3 = (int)*(out + index) & (255 - imask);
out[index] = (unsigned char)(itmp2 | itmp3);
bitcnt = bitcnt - tbit;
itmp = itmp >> tbit;
index--;
}
/* now byte aligned */
/* do by bytes */
while (bitcnt >= 8)
{
out[index] = (unsigned char)(itmp & 255);
itmp = itmp >> 8;
bitcnt = bitcnt - 8;
index--;
}
/* do last byte */
if (bitcnt > 0)
{
itmp2 = itmp & ones[bitcnt - 1];
itmp3 = (int)*(out + index) & (255 - ones[bitcnt - 1]);
out[index] = (unsigned char)(itmp2 | itmp3);
}
}
}
gbit
void gbit(unsigned char *in, g2int *iout, g2int iskip, g2int nbits)
Get arbitrary size values from a packed bit string, right justifying each value in the unpacked iout ...
Definition gbits.c:20
gbits
void gbits(unsigned char *in, g2int *iout, g2int iskip, g2int nbits, g2int nskip, g2int n)
Unpack arbitrary size values from a packed bit string, right justifying each value in the unpacked io...
Definition gbits.c:57
sbits
void sbits(unsigned char *out, g2int *in, g2int iskip, g2int nbits, g2int nskip, g2int n)
Store arbitrary size values into a packed bit string, taking the low order bits from each value in th...
Definition gbits.c:178
g2c_gbits_int
int g2c_gbits_int(unsigned char *in, int *iout, int iskip, int nbits, int nskip, int n)
Extract arbitrary size values from a packed bit string, right justifying each value in the unpacked i...
Definition gbits.c:137
g2c_gbit_int
void g2c_gbit_int(unsigned char *in, int *iout, int iskip, int nbits)
Extract arbitrary size values from a packed bit string, right justifying each value in the unpacked i...
Definition gbits.c:113
sbit
void sbit(unsigned char *out, g2int *in, g2int iskip, g2int nbits)
Store arbitrary size values into a packed bit string, taking the low order bits from each value in th...
Definition gbits.c:38
G2C_ENOMEM
#define G2C_ENOMEM
Out of memory.
Definition grib2.h:499
G2C_EINVAL
#define G2C_EINVAL
Invalid input.
Definition grib2.h:495
g2int
int64_t g2int
Long integer type.
Definition grib2.h:32
G2C_NOERROR
#define G2C_NOERROR
No error.
Definition grib2.h:490
grib2_int.h
Header file with internal function prototypes NCEPLIBS-g2c library.