Вверх ↑
Этот топик читают: Гость
Ответов: 1429
Рейтинг: 50
#1: 2011-06-04 01:10:02 ЛС | профиль | цитата
Обьясните мне, пожалуйста, почему я добавляю в память два байта а получаю шесть ?

code_24275.txt
карма: 0

0
файлы: 1code_24275.txt [1KB] [106]
Разработчик
Ответов: 26170
Рейтинг: 2127
#2: 2011-06-04 01:16:35 ЛС | профиль | цитата
logingin, ты добавляешь не два байта, а три за раз, потому, что применяешь запись типа PString, а этот тип нулевым байтом добавляет длину строки, а целое число в тексте занимает два байта. Итого: все правильно, два по три -- получается шесть
А вот теперь объясни, что ты хочешь сохранить
карма: 22

0
Ответов: 1429
Рейтинг: 50
#3: 2011-06-04 01:27:57 ЛС | профиль | цитата
nesco, я хочу писать ответ сервера в память, затем посимвольно складывать его из чанков. Для этого мне надо понять как накапливать ответ сервера в неизменном виде, и работать с ним посимвольно.
------------ Дoбавленo в 01.27:
Но это трудно, вот эта схема тоже не работает, почему?:


Add(MainForm,2953706,231,259)
{
Width=696
Height=403
Position=1
link(onCreate,10704837:doEvent1,[])
}
Add(DoData,6829370,420,238)
{
Data=String(a1)
link(onEventData,1453838:doWork1,[(499,244)])
}
Add(MemoryStream,8577920,707,238)
{
}
Add(DataToFile,16464081,707,287)
{
Point(doPosition)
Point(Position)
link(onGet,12031655:doConvert,[])
link(Stream,8577920:Stream,[])
}
Add(Memo,6641964,826,287)
{
Left=130
Top=60
Width=485
Height=250
ScrollBars=2
}
Add(Hub,10704837,294,273)
{
OutCount=4
link(onEvent1,6829370:doData,[(348,279)(348,244)])
link(onEvent2,11928595:doData,[(347,286)(347,335)])
link(onEvent3,9804881:doData,[(337,293)(337,384)])
link(onEvent4,16464081:doGet,[])
}
Add(DoData,11928595,420,329)
{
Data=String(a2)
link(onEventData,1453838:doWork3,[(499,335)])
}
Add(HubEx,1453838,495,287)
{
link(onEvent,10569960:doConvert,[])
}
Add(DoData,9804881,483,378)
{
Data=Integer(0)
link(onEventData,16464081:doPosition,[(692,384)(692,307)])
}
Add(convertor,10569960,651,287)
{
Mode=3
link(onResult,16464081:doPut,[])
}
Add(convertor,12031655,756,287)
{
Mode=4
link(onResult,6641964:doAdd,[])
}


карма: 0

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#4: 2011-06-04 01:41:50 ЛС | профиль | цитата
login писал(а):
вот эта схема тоже не работает, почему?

Chr -- это один символ с байтовым значением в диапазоне от 0 до 255, а не ДВА символа строки, это уже будет два Chr.

login, складывается впечетление, что я тебе Америку открываю, или ты этого никогда не знал
карма: 22

0
Ответов: 1429
Рейтинг: 50
#5: 2011-06-04 01:46:36 ЛС | профиль | цитата
nesco, не знал, я говорил, что я не программист. Мне просто очень надо, вот я и занимаюсь этим без знаний вообще.
Я в точности соответствую категории "Пользователь"
карма: 0

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#6: 2011-06-04 01:49:58 ЛС | профиль | цитата
login писал(а):
я не программист

Я -- тоже
карма: 22

0
Ответов: 1429
Рейтинг: 50
#7: 2011-06-04 01:51:10 ЛС | профиль | цитата
nesco,

nesco, вот вроде получилось, но где делась вторая часть "а2"?

code_24276.txt
карма: 0

0
файлы: 1code_24276.txt [1.4KB] [117]
Разработчик
Ответов: 26170
Рейтинг: 2127
#8: 2011-06-04 02:02:42 ЛС | профиль | цитата
login, короче, если просто, то строка -- это символьное отображение бинарных байтовых данных
------------ Дoбавленo в 01.55:
login писал(а):
но где делась вторая часть "а2"

HEX -- это ТЕКСТОВОЕ представление шестнадцатиричного формата бинарных данных, где каждый символ отображает полубайт в диапазоне значений от 0 до 15, два символа отображают байт. ИТОГО: четыре символа, а пишим только два в типе Word
------------ Дoбавленo в 01.58:
login, используй посимвольное чтение строки с преобразованием ChrToInt и побайтную запись. Или, что еще лучше, используй StreamCopy, где сразу можно задать нужную длину и считать ее, предварительно записав в MemoryStream и установив там нужную позицию чтения. После копирования указатель позиции в MemoryStream автоматически переместится на следующий байт за последним символом копируемого блока
------------ Дoбавленo в 02.02:
А еще лучше, посмотри мой пример из параллельной ветки -- http://forum.hiasm.com//getfile/24269, он тебе может сильно помочь, там как раз реализован метод блочного копирования
карма: 22

0
Ответов: 1429
Рейтинг: 50
#9: 2011-06-04 02:04:54 ЛС | профиль | цитата
nesco писал(а):
предварительно записав в MemoryStream
вот это мне не понятно, как записать весь, кусочный, ответ сервера в MemoryStream, спина к спине?
карма: 0

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#10: 2011-06-04 02:13:19 ЛС | профиль | цитата
login писал(а):
весь, кусочный, ответ сервера в MemoryStream, спина к спине?

Через накопитель потока, схему не раз уже приводили
карма: 22

0
Ответов: 1429
Рейтинг: 50
#11: 2011-06-04 02:29:52 ЛС | профиль | цитата
nesco писал(а):
пример из параллельной ветки
сложный. Я быстрее разберусь, если идти последовательно. В данный момент я немогу засунуть ответ сервера в MemoryStream. А алгоритм со StreamCopy я, примерно, увидел.
------------ Дoбавленo в 02.18:
nesco, это накопитель потока?


Add(StrCat,13973622,357,63)
{
Point(doClear)
link(Str1,13669875:Var1,[(363,50)(401,50)(401,103)])
}
Add(StrCat,15217876,357,126)
{
Str2="
"
Point(doClear)
link(onStrCat,9390330:doEvent1,[])
link(Str1,13669875:Var2,[])
}
Add(Hub,9390330,399,126)
{
OutCount=3
PColor(onEvent3,255)
link(onEvent2,13973622:doClear,[(423,139)(423,167)(345,167)(345,76)])
}
Add(GetDataEx,13669875,357,98)
{
link(Data,13973622:Result,[])
}


------------ Дoбавленo в 02.27:
nesco писал(а):
схему не раз уже приводили
а зачем схему? Я думал я, в начале темы, и привел схему "накопителя" который накапливает поток прямо в MemoryStream, добавляя в память новые поступающие данные. Не могу представить никакую другую схему. Только оно не работает из-за неверных форматов данных, про которые я и спрашивал.
------------ Дoбавленo в 02.29:
Не понятно, почему!! требуется два вызова, чтобы вытащить данные из памяти, они что там храняться раздельно?


Add(MainForm,2953706,231,252)
{
Width=696
Height=403
Position=1
link(onCreate,10704837:doEvent1,[])
}
Add(DoData,6829370,420,238)
{
Data=String(a1)
link(onEventData,1453838:doWork1,[(499,244)])
}
Add(MemoryStream,8577920,707,238)
{
}
Add(DataToFile,16464081,707,287)
{
Type=1
Point(doPosition)
Point(Position)
link(onGet,3939613:doConvert,[])
link(Stream,8577920:Stream,[])
}
Add(Memo,6641964,847,287)
{
Left=130
Top=60
Width=485
Height=250
ScrollBars=2
}
Add(Hub,10704837,294,266)
{
OutCount=5
PColor(onEvent4,255)
PColor(onEvent5,255)
link(onEvent1,6829370:doData,[(348,272)(348,244)])
link(onEvent2,11928595:doData,[(347,279)(347,335)])
link(onEvent3,9804881:doData,[(336,286)(336,384)])
link(onEvent4,8823306:doWork1,[(382,293)])
link(onEvent5,8823306:doWork2,[])
}
Add(Timer,3109093,609,42)
{
Interval=150
link(onTimer,8669810:doData,[])
}
Add(Label,5054268,707,42)
{
Left=40
Top=65
}
Add(DoData,8669810,658,42)
{
link(onEventData,5054268:doText,[])
link(Data,8577920:Size,[(664,30)(753,30)(753,277)(720,277)])
}
Add(DoData,11928595,420,329)
{
Data=String(a2)
link(onEventData,1453838:doWork3,[(499,335)])
}
Add(HubEx,1453838,495,287)
{
link(onEvent,8027275:doConvert,[])
}
Add(DoData,9804881,483,378)
{
Data=Integer(0)
link(onEventData,16464081:doPosition,[(692,384)(692,307)])
}
Add(Stream2Hex,8027275,651,287)
{
Mode=2
link(onResult,16464081:doPut,[])
}
Add(Stream2Hex,3939613,756,287)
{
Mode=3
link(onResult,6641964:doAdd,[])
}
Add(HubEx,8823306,378,294)
{
PColor(onEvent,255)
link(onEvent,16464081:doGet,[])
}


карма: 0

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#12: 2011-06-04 02:34:35 ЛС | профиль | цитата
login писал(а):
это накопитель потока?

Да, строкового потока
------------ Дoбавленo в 02.31:
login писал(а):
Я думал я, в начале темы, и привел схему "накопителя" который накапливает поток прямо в MemoryStream

Это очень медленный накопитель
------------ Дoбавленo в 02.34:
login писал(а):
требуется два вызова, чтобы вытащить данные из памяти

Интересно, а четыре разделить на два (длина типа Word в байтах) сколько будет
карма: 22

0
Ответов: 1429
Рейтинг: 50
#13: 2011-06-04 02:42:48 ЛС | профиль | цитата
nesco писал(а):
четыре разделить на два
но зачем надо делить? Я понимаю так:

1. hub >> "a1" >> преобразование в другой формат >> запись в элемент MemoryStream.
2. hub >> "a2" >> преобразование в другой формат >> запись в элемент MemoryStream (притулить к тому, что уже там в памяти есть)

Извлечение:

элемент MemoryStream >> преобразование в другой формат >> "a1a2"

почему нельзя так просто?
карма: 0

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#14: 2011-06-04 02:52:42 ЛС | профиль | цитата
login писал(а):
почему нельзя так просто?

Да потому, что тип указан dtWord, вот почему, а это записывается и читается по два байта, неужели это понять нельзя
карма: 22

0
Ответов: 1429
Рейтинг: 50
#15: 2011-06-04 02:53:55 ЛС | профиль | цитата
А с накопителем вообще перестало работать:
code_24277.txt

Как записать, накопленную, строку в MemoryStream?
карма: 0

0
файлы: 1code_24277.txt [2.1KB] [148]
Сообщение
...
Прикрепленные файлы
(файлы не залиты)