28AisBitstring::AisBitstring(
const char *str) {
32 memset(bitbytes, 0,
sizeof(bitbytes));
33 size_t len = strlen(str);
34 if (len > AIS_MAX_MESSAGE_LEN) len = AIS_MAX_MESSAGE_LEN;
35 byte_length =
static_cast<int>(len);
36 for (
int i = 0; i < byte_length; i++) {
37 bitbytes[i] = to_6bit(str[i]);
41int AisBitstring::GetBitCount() {
return byte_length * 6; }
45unsigned char AisBitstring::to_6bit(
const char c) {
46 if (c < 0x30)
return (
unsigned char)-1;
47 if (c > 0x77)
return (
unsigned char)-1;
48 if ((0x57 < c) && (c < 0x60))
return (
unsigned char)-1;
58 return (
unsigned char)(cp & 0x3f);
67 for (
int i = 0; i < len; i++) {
70 cx = (cp >= 0 && cp < byte_length) ? bitbytes[cp] : 0;
71 c0 = (cx >> (5 - ((s0p + i) % 6))) & 1;
72 if (i == 0 && signed_flag &&
81int AisBitstring::GetStr(
int sp,
int bit_len,
char *dest,
int max_len) {
83 char *temp_str = dest;
92 while (i < bit_len && k < max_len) {
94 for (
int j = 0; j < 6; j++) {
97 cx = (cp >= 0 && cp < byte_length) ? bitbytes[cp] : 0;
98 cs = 5 - ((s0p + i) % 6);
104 temp_str[k] = (char)(acc & 0x3f);
106 if (acc < 32) temp_str[k] += 0x40;
int GetInt(int sp, int len, bool signed_flag=false)
sp is starting bit, 1-based