fix checking UDL lenth for different encoding and different formats
This commit is contained in:
@ -68,9 +68,9 @@ EOF
|
||||
|
||||
die() { echo "ERROR: $*" >&2; exit 1; }
|
||||
|
||||
# ══════════════════════════════════════════════════════════════════
|
||||
# ═════════════════════════════════════════════════════════════════
|
||||
# РАЗБОР АРГУМЕНТОВ
|
||||
# ══════════════════════════════════════════════════════════════════
|
||||
# ═════════════════════════════════════════════════════════════════
|
||||
POSITIONAL=()
|
||||
while (( $# > 0 )); do
|
||||
case "$1" in
|
||||
@ -241,10 +241,15 @@ build_gsm7() {
|
||||
}
|
||||
|
||||
build_ucs2() {
|
||||
local raw
|
||||
raw=$(printf '%s' "$1" | iconv -f UTF-8 -t UTF-16BE 2>/dev/null) || die "iconv: неверная UTF-8 строка"
|
||||
TEXT_HEX=$(printf '%s' "$raw" | xxd -p | tr -d '\n' | tr 'a-f' 'A-F')
|
||||
UDL=$(( ${#TEXT_HEX} / 2 ))
|
||||
# iconv → xxd напрямую, без сохранения в переменную (bash не держит \x00)
|
||||
TEXT_HEX=$(printf '%s' "$1" | iconv -f UTF-8 -t UTF-16BE 2>/dev/null \
|
||||
| xxd -p | tr -d '\n' | tr 'a-f' 'A-F')
|
||||
|
||||
if [[ -z "$TEXT_HEX" ]]; then
|
||||
die "iconv: не удалось сконвертировать текст в UTF-16BE"
|
||||
fi
|
||||
|
||||
UDL=$(( ${#TEXT_HEX} / 2 )) # для UCS2 это БАЙТЫ, не символы
|
||||
}
|
||||
|
||||
# ══════════════════════════════════════════════════════════════════
|
||||
@ -254,8 +259,15 @@ build_ucs2() {
|
||||
|
||||
if [[ "$ENCODING" == "gsm" ]]; then build_gsm7 "$TEXT"; else build_ucs2 "$TEXT"; fi
|
||||
|
||||
MAX_UDL=160
|
||||
[[ "$ENCODING" == "ucs2" ]] && MAX_UDL=70
|
||||
# ══════════════════════════════════════════════════════════════════
|
||||
# ПРОВЕРКА ДЛИНЫ (ИСПРАВЛЕНО)
|
||||
# ══════════════════════════════════════════════════════════════════
|
||||
if [[ "$ENCODING" == "ucs2" ]]; then
|
||||
MAX_UDL=140 # Лимит в БАЙТАХ для UCS2 (140 байт = 70 символов)
|
||||
else
|
||||
MAX_UDL=160 # Лимит в СЕПТЕТАХ для GSM 7-bit
|
||||
fi
|
||||
|
||||
(( UDL <= MAX_UDL )) || die "текст длиннее одного SMS ($UDL > $MAX_UDL). Нужна конкатенация/UDH"
|
||||
|
||||
FO=$(build_fo)
|
||||
@ -266,16 +278,18 @@ VP_HEX=""
|
||||
[[ -n "$VALIDITY_MIN" ]] && VP_HEX=$(build_vp "$VALIDITY_MIN")
|
||||
|
||||
build_da "$RECEIVER" "$TOA"
|
||||
DA_PART="$DA_HEX"
|
||||
|
||||
SMSC_HEX=""
|
||||
SMSC_PART=""
|
||||
if (( USE_SMSC )); then
|
||||
build_smsc "$SMSC" 91
|
||||
SMSC_PART="$SMSC_HEX"
|
||||
fi
|
||||
|
||||
# [FO][MR][DA][PID][VP?][DCS][UDL][UD]
|
||||
TPDU="${FO}${MR_HEX}${DA_HEX}00${VP_HEX}${DCS}${UDL_HEX}${TEXT_HEX}"
|
||||
TPDU="${FO}${MR_HEX}${DA_PART}00${VP_HEX}${DCS}${UDL_HEX}${TEXT_HEX}"
|
||||
TPDU_LEN=$(( ${#TPDU} / 2 ))
|
||||
FULL_PDU="${SMSC_HEX}${TPDU}"
|
||||
FULL_PDU="${SMSC_PART}${TPDU}"
|
||||
|
||||
echo "FO=$FO MR=$MR_HEX PID=00 DCS=$DCS UDL=$UDL_HEX VP=${VP_HEX:-none}"
|
||||
echo "CLASS=${CLASS:-не задан} ENCODING=$ENCODING"
|
||||
|
||||
Reference in New Issue
Block a user