fix checking UDL lenth for different encoding and different formats

This commit is contained in:
2026-10-26 05:33:58 +03:00
parent 538931d35f
commit 2d0be0500d

View File

@ -68,9 +68,9 @@ EOF
die() { echo "ERROR: $*" >&2; exit 1; } die() { echo "ERROR: $*" >&2; exit 1; }
# ══════════════════════════════════════════════════════════════════ # ═════════════════════════════════════════════════════════════════
# РАЗБОР АРГУМЕНТОВ # РАЗБОР АРГУМЕНТОВ
# ══════════════════════════════════════════════════════════════════ # ═════════════════════════════════════════════════════════════════
POSITIONAL=() POSITIONAL=()
while (( $# > 0 )); do while (( $# > 0 )); do
case "$1" in case "$1" in
@ -241,10 +241,15 @@ build_gsm7() {
} }
build_ucs2() { build_ucs2() {
local raw # iconv → xxd напрямую, без сохранения в переменную (bash не держит \x00)
raw=$(printf '%s' "$1" | iconv -f UTF-8 -t UTF-16BE 2>/dev/null) || die "iconv: неверная UTF-8 строка" TEXT_HEX=$(printf '%s' "$1" | iconv -f UTF-8 -t UTF-16BE 2>/dev/null \
TEXT_HEX=$(printf '%s' "$raw" | xxd -p | tr -d '\n' | tr 'a-f' 'A-F') | xxd -p | tr -d '\n' | tr 'a-f' 'A-F')
UDL=$(( ${#TEXT_HEX} / 2 ))
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 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" (( UDL <= MAX_UDL )) || die "текст длиннее одного SMS ($UDL > $MAX_UDL). Нужна конкатенация/UDH"
FO=$(build_fo) FO=$(build_fo)
@ -266,16 +278,18 @@ VP_HEX=""
[[ -n "$VALIDITY_MIN" ]] && VP_HEX=$(build_vp "$VALIDITY_MIN") [[ -n "$VALIDITY_MIN" ]] && VP_HEX=$(build_vp "$VALIDITY_MIN")
build_da "$RECEIVER" "$TOA" build_da "$RECEIVER" "$TOA"
DA_PART="$DA_HEX"
SMSC_HEX="" SMSC_PART=""
if (( USE_SMSC )); then if (( USE_SMSC )); then
build_smsc "$SMSC" 91 build_smsc "$SMSC" 91
SMSC_PART="$SMSC_HEX"
fi fi
# [FO][MR][DA][PID][VP?][DCS][UDL][UD] # [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 )) 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 "FO=$FO MR=$MR_HEX PID=00 DCS=$DCS UDL=$UDL_HEX VP=${VP_HEX:-none}"
echo "CLASS=${CLASS:-не задан} ENCODING=$ENCODING" echo "CLASS=${CLASS:-не задан} ENCODING=$ENCODING"