Автор Тема: При вызове СОМ-объекта возвращаемая строка обрывается на символе NUL  (Прочитано 3978 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн AvDA [?]

  • Новичок
  • *
  • Сообщений: 9
  • Репутация: 0
    • Награды
Добрый день.
Есть библиотека, которая в определенный момент возвращает строку длинной 32 символа, в этой строке могут быть любые символы из таблицы ASCII, например самый первый (нулевой) символ NUL.
Проблема в том, что если в строке имеется симво NUL, то на этом строка и обрывается. Получается, что библиотека формирует строку правильно, а в момент "передачи" от библиотеке к AutoIt этот символ рассматривается как конец строки.
Подскажите, куда копать?

библиотека заведомо исправна, предназначена для работы с кассовыми аппаратами, устанавливается автоматически при установки вот этой программы ссылка:http://ftp://ftp.shtrih-m.ru/download/FR/shtrih-fr-k/Drivers/DrvFR_A4.6.11.rar [nonactive]

Русское сообщество AutoIt


Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2315
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
AvDA,
А если как-то так?
Код: AutoIt [Выделить]
Local $sStr, $sDelim, $iStart = 0, $iEnd = 255, $iStep = 1

For $j = 1 To 2
    For $i = $iStart To $iEnd Step $iStep
        $sStr &= Chr($i)
    Next
    $iStart = 255
    $iEnd = 0
    $iStep = -1
Next
ConsoleWrite('---' & @LF)
ConsoleWrite($sStr & @LF)
ConsoleWrite('---' & @LF)
$sDelim = _GetDelimiter($sStr)
ConsoleWrite($sDelim & @LF)
ConsoleWrite('---' & @LF)
$sStr = StringReplace($sStr, Chr(0), $sDelim)
ConsoleWrite('---' & @LF)
ConsoleWrite($sStr & @LF)

Func _GetDelimiter($s_String)
    Local $i_Count = 1, $s_Delim
    While 1
        $s_Delim = ''
        For $j = 1 To $i_Count
            $s_Delim &= Chr(Random(32, 255, 1));Chr(Random(1, 255, 1))
        Next
        If Not StringInStr($s_String, $s_Delim) Then Return $s_Delim
        $i_Count += 1
    WEnd
EndFunc   ;==>_GetDelimiter

Или так?
Код: AutoIt [Выделить]
Local $sStr, $iStart = 0, $iEnd = 255, $iStep = 1

For $j = 1 To 2
    For $i = $iStart To $iEnd Step $iStep
        $sStr &= Chr($i)
    Next
    $iStart = 255
    $iEnd = 0
    $iStep = -1
Next
ConsoleWrite('---' & @LF)
ConsoleWrite($sStr & @LF)
ConsoleWrite('---' & @LF)
$sStr = StringReplace($sStr, Chr(0), '')
ConsoleWrite('---' & @LF)
ConsoleWrite($sStr & @LF)


Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2713
  • Репутация: 1137
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
AvDA
Если вывод в GUI то естественно все будет обрезано до Null. Как уже сказано выше удалить символы перед выводом для просмотра или заменить самим текстом [Null].





Добавлено: Май 24, 2013, 09:30:20
madmasles
Вот более универсальный _GetDelimiter, вырезал из своей функции _StringSplitRegExp.
Код: AutoIt [Выделить]
; Автор ..........: AZJIO
Func _GetDelimiter($sString)
    Local $sDelim, $, $Toggle, $iPos = 1
        For $i = 1 To 30
            $Toggle = Not $Toggle
            If $Toggle Then ; 1, 30, 3, 28    ...   27, 4, 29, 2
                $sDelim &= Chr($i)
            Else
                $sDelim &= Chr(32 - $i)
            EndIf
            $iPos = StringInStr($sString, $sDelim, 1, 1, $iPos) ; смещение позволяет найти разделитель за 1 проход
            If Not $iPos Then ExitLoop ; если вхождение не найдено, то разделитель сформирован
        Next
        If $iPos Then Return SetError(1, 0, $aError)
        Return $sDelim
EndFunc   ;==>_StringSplitRegExp

« Последнее редактирование: Май 24, 2013, 09:30:21 от AZJIO, Причина: Объединение сообщений »

Оффлайн AvDA [?]

  • Новичок
  • *
  • Сообщений: 9

  • Автор темы
  • Репутация: 0
    • Награды
Может я что-то недопонимаю, но, раз вот это работает правильно
Код: AutoIt [Выделить]
 
$tmp=Chr(48)&Chr(49)&Chr(50)&Chr(0)&Chr(0)&Chr(48)&Chr(49)&Chr(50)&Chr(51)&Chr(50)&Chr(52)
MsgBox (0, "", Stringlen($tmp))
 

получим в MsgBox   11 ,
то и это должно работать правильно
Код: AutoIt [Выделить]
   $FR.Password=0
   $FR.DeviceCode=1
   $FR.DampRequest          ; сформировали запрос
   $FR.GetData              ; запросили первый блок,  данные первого блока в $FR.DataBlock
MsgBox(0,"",StringLen($FR.DataBlock)))
 

получим в MsgBox   5

т.е. получаем, что переменная $FR.DataBlock уже обрезана
хотя изначально она
14 06 11 29 46 00 00 00 62 08 71 23 77 00 00 00 50 40 30 00 FF FF FF FF  FF FF FF FF FF FF FF FF
но в кодах ASCII

Русское сообщество AutoIt


Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2713
  • Репутация: 1137
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
AvDA
Да, объект обрезает, вот проверил на другом примере
Код: AutoIt [Выделить]
$vNewValue = Chr(48) & Chr(49) & Chr(50) & Chr(0) & Chr(0) & Chr(48) & Chr(49) & Chr(50) & Chr(51) & Chr(50) & Chr(52)
Local $oDict = ObjCreate("Scripting.Dictionary")
$oDict.CompareMode = 0 ; бинарный режим
$oDict.Item(1) = $vNewValue
$sText = $oDict.Item(1)
MsgBox(0, Stringlen($sText), $sText)

Что делать не знаю, во внутрь AutoIt3 доступа нет, только сообщать о багах.

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
13 Ответов
7146 Просмотров
Последний ответ Декабрь 09, 2009, 23:56:19
от Kaster
12 Ответов
5799 Просмотров
Последний ответ Июнь 18, 2012, 11:47:15
от AZJIO
7 Ответов
4543 Просмотров
Последний ответ Декабрь 21, 2012, 04:40:01
от Yashied
2 Ответов
847 Просмотров
Последний ответ Сентябрь 03, 2014, 09:57:15
от oesoes
10 Ответов
1789 Просмотров
Последний ответ Август 17, 2015, 14:36:54
от Yashied
25 Ответов
2863 Просмотров
Последний ответ Сентябрь 09, 2015, 00:13:10
от InnI
6 Ответов
1553 Просмотров
Последний ответ Январь 21, 2016, 13:39:54
от InnI
3 Ответов
1097 Просмотров
Последний ответ Февраль 20, 2016, 09:00:13
от mmsgeorge
3 Ответов
1489 Просмотров
Последний ответ Июнь 16, 2016, 20:05:55
от Dimmak
4 Ответов
568 Просмотров
Последний ответ Май 30, 2017, 13:57:49
от ErikRosso