微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

问题生成 unicode PDU 消息 16 位二进制

如何解决问题生成 unicode PDU 消息 16 位二进制

我正在使用从 github 找到的 PDU 生成器,并且在生成简单的 7 位字符消息时一切正常。

问题是我想以 16 位模式发送 Unicode 字符并且我必须输入一个 UTF-16BE 格式的十六进制值的字符消息,每个 Unicode 字符分成两个字符。

假设 'Ė' 的 Unicode 字符将转换为 Unicode 中的 U+0116,并在我的程序中转换为 '\x01\x16'。

我根据 github 存储库中的示例使用此格式。

char* message = "\x01\x01\x01\x16"; // Output message will translate to 'āĖ' and is working fine

然而,输入一个包含 '\x00' 十六进制值的字符将像这样忽略消息的其余部分。

char* message = "\x01\x01\x01\x16\x00\x41\x00\x42\x00\x43"; // Output message will translate to 'āĖ'
// when decoded but should instead contain  'āĖABC'

我试图寻找解决方案但没有成功,这里是编码函数的一些部分,它似乎生成了 PDU 消息。

void make_pdu(char* number,char* message,int messagelen,int alphabet,int flash_sms,int report,int with_udh,char* udh_data,char* mode,char* pdu,int validity,int replace_msg,int system_msg,int number_type)
{
  int coding;
  int flags;
  char tmp[50];
  char tmp2[500];
  int numberformat;
  int numberlength;
  char *p;
  int l;

  ...

  if (alphabet == 1)
    coding = 4; // 8bit binary
  else if (alphabet == 2)
    coding = 8; // 16bit <THE OPTION I USE>
  else
    coding = 0; // 7bit
  if (flash_sms > 0)
    coding += 0x10; // Bits 1 and 0 have a message class meaning (class 0,alert)

  /* Create the PDU string of the message */
  if (alphabet==1 || alphabet==2 || system_msg) // THE OPTION I USE
  {
    ...
    binary2pdu(message,messagelen,tmp2);
  }
  else
    messagelen=text2pdu(message,tmp2,udh_data);

  /* concatenate the first part of the PDU string */
  if (strcmp(mode,"old")==0)
    sprintf(pdu,"%02X00%02X%02X%s00%02X%02X",flags,numberlength,numberformat,tmp,coding,messagelen);
  else // THE OPTION I USE
  {
    ...
    sprintf(pdu,"00%02X00%02X%02X%s%02X%02X%02X%02X",proto,validity,messagelen);
  }

  /* concatenate the text to the PDU string */
  strcat(pdu,tmp2);
}
/* Converts binary to PDU string,this is basically a hex dump. */
void binary2pdu(char* binary,int length,char* pdu)
{
  int character;
  char octett[10];

  if (length>maxsms_binary)
    length=maxsms_binary;
  pdu[0]=0;
  for (character=0;character<length; character++)
  {
    //printf("Beep\n");
    sprintf(octett,"%02X",(unsigned char) binary[character]);
    strcat(pdu,octett);
  }
}

解决方法

正如 MikeCAT 所指出的,\x00 的值表示字符串的结尾。我一直在使用 strlen() 来指定问题所在字符串的长度。跟踪消息的正确长度解决了问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。