|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
Бинарный файл board.tjb содержит данные (блоки) разного типа (int long sring …) Всё содержимое бинарного файла я считываю в массив типа Byte Для поиска строк в блоке текста я использую ф-ю InStr, но для этого приходится сначала «перегнать» блок в строковую переменную. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
А нельзя ли как-то совместить некую строковую переменную с элементами с 100 по 200 массива b , чтобы избежать копирования блока в переменную (некий аналог ссылок из С++) ? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2020, 22:08 |
|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
Дмитрий П., Можно не перегонять байтовый массив в строку, а сразу искать нужный паттерн в массиве. авторFor i = 100 To 200 str = str & Chr(b(i)) Next i Очень медленный вариант. Копирование по-одному байту в цикле. Лучше скопировать сразу весь блок в 100 байтов в строку с помощью API функции CopyMemory. авторА нельзя ли как-то совместить некую строковую переменную с элементами с 100 по 200 массива b , чтобы избежать копирования блока в переменную (некий аналог ссылок из С++) ? Если бы VB6 поддерживал Union как Си или PowerBasic можно было бы легко совместить. А так имхо простого варианта нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2020, 23:11 |
|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
Дмитрий П., используй функцию StrStrA ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2020, 23:58 |
|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
Дмитрий П., во первых, вы можете читать не в байтовый массив, а сразу в строку. Если какой-то другой, не показанной логикой определяется необходимость работы именно с байтовым массивом, то поразглядывайте вот такой вариант кода: (он не для всякого содержания произвольного файла правильно отработает, могут быть кости в много слов, но все равно поглядите.) Вариант, кстати, не единственный, но смысла пускаться в другие особого нет, для некоторого подмножества содержимого файла. В частности - здесь точно подразумевается, что в файле сидят строки в ANSI - кодировке. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2020, 01:10 |
|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
Дмитрий П., Кстати, в общих чертах опишите и покажите пример требований к обработке найденного компонента. с этим тоже могут быть интересные варианты, похожие на "аналог ссылок из C++" может быть, накидаю вариант под ваш пример. Для порядка уточните среду выплнения - исполняемый VB6 или VBA. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2020, 13:13 |
|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
Непонятно зачем автор в ручную парсит .tlb файл? Если для этого существует TlbInf32.dll ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2020, 13:31 |
|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
ATM-TURBO 2 Дмитрий П., используй функцию StrStrA Не могу сообразить, как использовать эту функцию в Visual Basic 6.0. Не дадите примерчик? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2020, 22:09 |
|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
Eolt Дмитрий П., Лучше скопировать сразу весь блок в 100 байтов в строку с помощью API функции CopyMemory. Копирования Byte в Byte получается, а Byte в String - нет : Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
Как использовать CopyMemory, для копирования байтов в строку? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2020, 23:35 |
|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
Дмитрий П. Как использовать CopyMemory, для копирования байтов в строку? Вот так например: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2020, 23:53 |
|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
Дмитрий П. ATM-TURBO 2 Дмитрий П., используй функцию StrStrA Не могу сообразить, как использовать эту функцию в Visual Basic 6.0. Не дадите примерчик? https://www.cyberforum.ru/post14970478.html ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2020, 23:56 |
|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
Eolt Вот так например: Код: vbnet 1. 2. 3. 4. 5. 6. 7.
Ваш код выдает у мееня строку из 9ти пробелов, т.е. CopyMemory не сработала !? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2020, 12:20 |
|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
Дмитрий П. Ваш код выдает у мееня строку из 9ти пробелов, т.е. CopyMemory не сработала !? Сработала. Только в том коде ошибка небольшая :) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2020, 13:53 |
|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
Дмитрий П. ... Ваш код выдает у мееня строку из 9ти пробелов, т.е. CopyMemory не сработала !? вы не показываете, в какую переменную копируете. Если вы заменили определение Dim str1 As String на показанное в стартовом посте Dim str1 As String*100 То в таком случае показанный вариант вызова CopyMemory и не должен работать . Фиксированные строки размещаются на стеке, и StrPtr для них температуру на Марсе показывает. Точка начала копирования для них определяется как VarPtr(str1) + 4, где 4 - длина long переменной, хранящей длину строки... Инициализировать такую пробелами не надо, она на всю свою длину будет инициализирована chr(0) при объявлении. -------- Мне вот любопытно, по какой причине вы мой пост целиком проигнорировали? В заявленном вами случае использование win api не требуется совсем Стандартные строковые функции отлично работают с массивами. При прямой работе с неразжатыми байтами из файла нужно использовать бинарную форму этих функций. Просто и без api... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2020, 14:28 |
|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
booby, Стандартные строковые функции отлично работают с байтовыми массивами. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2020, 14:36 |
|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
Дмитрий П., В чем смысл вашего кода? Если парсинг .tlb файла то есть более подходящие способы. Например использование TLBINF32.DLL или вот пример ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2020, 15:02 |
|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
booby Стандартные строковые функции отлично работают с байтовыми массивами. Да, это самое правильное. Если хочется сложностей, то есть LSet, CopyMemory, GetMem/PutMem. Eolt парсинг .tlb файла А прочитать внимательнее? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2020, 15:06 |
|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
то есть, вы должны были сформулировать свой вопрос так (обратите внимание, ваш код оптимизирован): Дмитрий П. ... Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
А нельзя ли как-то совместить некую строковую переменную с элементами с 100 по 200 массива b , чтобы избежать копирования блока в переменную (некий аналог ссылок из С++) ? Тогда ответ бы был таким: строку с массивом, нормальным образном - нельзя. Но можно массив со строкой, меняя указатель на начало данных в массиве на необходимую позицию в строке. Но в вашем случае - этого не требуется, по крайней мере, на поверхности. Потому что строковые функции умеют работать с байтовыми массивами напрямую. Заменять решение, построенное на стандартных функциях нужно только при особенно жестких требованиях к производительности. Но, в любом случае, прежде чем это делать, сначала нужно выписать соответствующее задаче решение, построенное на стандартных функциях, и только после этого смотреть, насколько же оно требует оптимизации. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2020, 16:11 |
|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
booby, кстати, я сам напорол... конечно буфер в сто символов сможет принять 100 не разжатых байт, потому что его размер - 200 байт. должно быть str = StrConv(MidB(b, 101, 100), vbUnicode) мои извинения (((; ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2020, 16:59 |
|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
Eolt Сработала. Только в том коде ошибка небольшая :) Да, теперь у меня тоже сработала. Спасибо Но похоже не получится применить CopyMemory вместо побайтного копирования Код: vbnet 1.
поскольку в моем массиве b нет нулей после каждого кода символа ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2020, 17:48 |
|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
Дмитрий П. поскольку в моем массиве b нет нулей после каждого кода символа Нули это просто кодировка Unicode, чтобы потом строку можно было вывести на экран ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2020, 18:43 |
|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
booby Мне вот любопытно, по какой причине вы мой пост целиком проигнорировали? Простите. Вы писали: Код: vbnet 1. 2.
Нет, мой файл это не имитирует. Я неточно выразился вначале - в блоке поиска не только строки! Я посылаю реальный файл G327.TJB Он создан утилитой CLink (ПО установки внутрисхемного контроля). Формат закрыт, но эмпирически я вычислил где и как представлена нужная мне информация. В файле описаны все цепи и пины (контактные площадки) тестируемой платы. Для каждого пина цепи есть некий блок данных где может появится строка «Component» за которой указано имя компонента (он то мне и нужен), которй мешает щупам установки опуститься на этот пин. Например: - описание цепи «$1N309» с адреса (hex) 175D по 1986 - описание последнего пина «STP3» в этой цепи с 18BE по 1982 - блок поиска «Component» с 193D по 197D. А цель этого поиска выдать в отчет «FU1» (как компонент который мешает щупам опуститься на STP3.) Ваш пример сможет найти «Component» в byte массиве начиная с индекса 193D по 197D ? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2020, 18:48 |
|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
booby Для порядка уточните среду выплнения - исполняемый VB6 или VBA. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2020, 18:52 |
|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
Дмитрий П., конечно поможет! Про всякие другие уточнения я писал, предполагая, что после слова component идет ряд чисел в двоичном представлении, которые необходимо "максимально эффективно" разобрать, вычитывая в некую структуру. С этим могут быть отдельные заморочки, связанные с тем, как фактически записаны такие числа в бинарном представлении в файле - в big-endian или little-endian манере. Главное, если вы всегда читаете файл целиком, для поиска в нем "component" буфер того сорта, который вы описали - не нужен. Но что-то похожее было бы, наверно, нужно при неполном чтении файла. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2020, 19:05 |
|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
Вот этот код распечатает все вхождения Component в ваш бинарный массив. Что с этим делать дальше - вам виднее подставьте свой путь к файлу. (в выложенном вами файле этот код обнаруживает 13 вхождений Component) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2020, 20:18 |
|
Совмщение переменных разного типа
|
|||
---|---|---|---|
#18+
booby Главное, если вы всегда читаете файл целиком Читаю файл целиком, но искать «Component» надо строго в неком диапазоне индексов, который определяется для каждого пина динамически. Мой алгоритм обработки TJB такой (упрощенно): 1. ищется строка - имя 1й цепи («$1N1939») 1.1 ищется первый пин этой цепи (строка "C2" и 4 байта 01 00 00 00 т.е. С2.1) 1.1.1 через 82 байта считываю byHead - очень важный байт (поясню, если будет интересно) 1.1.2 далее идет блок байтов где может быть «Component» - (для С2.1 его нет, т.е ничего не мешает опуститься на него) 1.2 ищется след. пин этой цепи (C2.2) ... 2. ищется строка - имя следующей цепи (например «$1N309») 2.1 ищется первый пин этой цепи (D1.1) и его byHead т.е. определяем границы его блок поиска ... 2.3 ищется последний пин этой цепи («STP3») и его byHead т.е. получается блок поиска с 18BE по 1982 и там уже есть «Component» 3. отрабатываются остальные цепи с их пинами ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2020, 20:42 |
|
|
start [/forum/topic.php?fid=60&fpage=3&tid=2154767]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 158ms |
0 / 0 |