首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ASCII字符串转换为7位GSM编码方案

将ASCII字符串转换为7位GSM编码方案
EN

Stack Overflow用户
提问于 2018-04-20 14:43:35
回答 1查看 2.2K关注 0票数 2

我为将ASCII字符串转换为相应的7-bit GSM编码方案而编写的一个简单例程:

代码语言:javascript
复制
#include <stdio.h>
#include <process.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#include <inttypes.h>

/* convert ascii input string to 7-bit GSM alphabet */
bool ascii_to_gsm(const char* in, uint8_t len, uint8_t* out, uint8_t start_indx) {
    if (in == NULL || out == NULL || len == 0)
        return false;

    uint8_t nshift = 7;
    memcpy(out + start_indx, in, len);
    for (size_t i = 0; i < len - 1; i++) {
        nshift = (nshift == 255) ? 7 : nshift;
        uint16_t l = out[start_indx + i];
        uint16_t h = out[start_indx + i + 1];
        h = (h << nshift--) | l;
        out[start_indx + i] = h;
        out[start_indx + i + 1] = h >> 8;
    }

    return true;
}

int main() {
    char data[] = "ASCIIASCII";
    uint8_t buff[sizeof(data) - 1];
    memset(buff, 0, sizeof(buff));
    ascii_to_gsm(data, sizeof(buff), buff, 0);
    for (size_t i = 0; i < sizeof(buff); i++) {
        printf("\n buff[%d]=%02x", i, buff[i]);
    }
    system("pause");

    return 0;
}

对于像ASCIITEST这样的字符串,它工作得很好,输出分别是C1E9309904D4E2940A

但是对于字符串ASCIIASCII,某些输出字节是错误的:C1E930990C4E87498024

结果应该是:C1E930990C4E87C924

不知道哪一部分,我错了。

有关GSM编码的概念可以找到这里

我使用在线编码器来比较结果

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-20 15:39:56

但是对于字符串ASCIIASCII,某些输出字节是错误的: C1E930990C4E87498024 其结果应该是: C1E930990C4E87C924

OP的代码没有考虑到输出可能比输入的长度更短。

如果输入为10个ASCII字符,即70位。输出需要上限(70/8)或9字节。也见@Steve峰会

缺乏start_indx的一种简化的引用代码。因为输入是一个字符串(“转换ASCII字符串”),所以不需要输入长度。

代码语言:javascript
复制
bool ascii_to_gsmA(const char* in, uint8_t* out) {
  unsigned bit_count = 0;
  unsigned bit_queue = 0;
  while (*in) {
    bit_queue |= (*in & 0x7Fu) << bit_count;
    bit_count += 7;
    if (bit_count >= 8) {
      *out++ = (uint8_t) bit_queue;
      bit_count -= 8;
      bit_queue >>= 8;
    }
    in++;
  }
  if (bit_count > 0) {
    *out++ = (uint8_t) bit_queue;
    }
  return true;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49944276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档