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; }
# ══════════════════════════════════════════════════════════════════
# ═════════════════════════════════════════════════════════════════
# РАЗБОР АРГУМЕНТОВ
# ══════════════════════════════════════════════════════════════════
# ═════════════════════════════════════════════════════════════════
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"