问题生成 unicode PDU 消息 16 位二进制
Issue generating unicode PDU message 16bit binary
我正在使用从 github 找到的 PDU 生成器,生成简单的 7 位字符消息时一切正常。
问题是我想发送 Unicode 字符在 16 位模式下,我必须以 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,messagelen,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", flags, numberlength, numberformat, tmp, proto, coding, 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() 来确定问题所在的字符串的长度。跟踪消息的正确长度解决了问题。
我正在使用从 github 找到的 PDU 生成器,生成简单的 7 位字符消息时一切正常。
问题是我想发送 Unicode 字符在 16 位模式下,我必须以 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,messagelen,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", flags, numberlength, numberformat, tmp, proto, coding, 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() 来确定问题所在的字符串的长度。跟踪消息的正确长度解决了问题。