![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не могу найти три отличия в коде [D7]
Zheksonz © (2012-06-14 12:49:00)переводил с Си на Делфи следующий код:
__fastcall TWindow::TWindow(TComponent* Owner)
: TForm(Owner)
{
Encoding = TEncoding::UTF8;
ProtocolVersion = 0;
}
//---------------------------------------------------------------------------
void __fastcall TWindow::WriteString(UnicodeString String, TIdTCPClient *TCPClient)
{
Write7BitEncodedInt(Encoding->GetByteCount(String), TCPClient);
TCPClient->Socket->Write(String, Encoding);
}
void __fastcall TWindow::Write7BitEncodedInt(int value, TIdTCPClient *TCPClient)
{
for (; value >= 128; value >>= 7)
TCPClient->Socket->Write((unsigned char)(value | 128));
TCPClient->Socket->Write((unsigned char)value);
}
UnicodeString __fastcall TWindow::ReadString(TIdTCPClient *TCPClient)
{
return TCPClient->Socket->ReadString(Read7BitEncodedInt(TCPClient), Encoding);
}
int __fastcall TWindow::Read7BitEncodedInt(TIdTCPClient *TCPClient)
{
int value = 0, shift = 0, byteval;
while (((byteval = TCPClient->Socket->ReadByte()) & 128) != 0 & shift != 35)
{
value |= ((byteval & 127)
Zheksonz (2012-06-17 23:31:00) [1]Как обычно я протупил, по другому и не скажешь(((
объявленная мной переменнаяenc, типаTEncodingи впрямь = nil (спасибо sniknik), отсюда и EAccessViolation
> DVM © (17.06.12 19:10) [20]
А вот TEncoding.UTF8.GetByteCount возвращает количество байтов занимаемое строковой переменной. Спасибо.
DVM (2012-06-17 19:10:00) [2]
> Zheksonz (17.06.12 13:11) [17]
Тебе какая кодировка нужна? Вот ее класс и используй.
TEncoding.UTF8.GetByteCount
sniknik (2012-06-17 18:02:00) [3]> ну что сейчас-то не так??? ((((
enc = nil, внутрь процедуры можно не заглядывать, ее для nil нет.
Inovet (2012-06-17 16:50:00) [4]> [17] Zheksonz (17.06.12 13:11)
> Delphi 2009 или более позднюю версию
или более позднюю
Zheksonz (2012-06-17 13:11:00) [5]Чувствую придётся всё-таки установить Delphi 2009 или более позднюю версию...
В общем прикрутил к проекту MLang, всё сделал предельно просто:
var
strng: string;
i: Integer;
enc: TEncoding;
begin
strng := 'wrwdsfsfsrwer';
i := enc.GetByteCount(strng);
end;
но при запуске этой процедуры выскакивает ошибка EAccessViolation в функции:
function TEncoding.GetByteCount(const S: string): Integer;
begin
Result := GetByteCount(PChar(S), Length(S));
end;
ну что сейчас-то не так??? ((((
Zheksonz (2012-06-16 23:35:00) [6]
> Anatoly Podgoretsky © (16.06.12 23:05) [15]
Ехидство подтверждающее сказанное мной ранее... а не пришло ли время поумничать?
Anatoly Podgoretsky (2012-06-16 23:05:00) [7]
> Zheksonz (16.06.12 22:01) [14]
Значит для тебя не судьба, придется отказаться от мечты.
Zheksonz (2012-06-16 22:01:00) [8]
> Anatoly Podgoretsky © (16.06.12 15:44) [12]
Надо полагать вы так же жили, ехидничая и умничая.
> DVM © (16.06.12 16:34) [13]
Спасибо, это то что нужно! Жаль у меня нет возможности Вас отблагодарить не только на словах, но и на деле.
DVM (2012-06-16 16:34:00) [9]
> Zheksonz (16.06.12 13:57) [11]
> А в Делфи 7 нельзя реализовать подобное, без класса TEncoding?
Можно и без, но имхо с ним гораздо удобнее. Тем более, что его и Delphi 7 можно прикрутить. Тут http://www.webdelphi.ru/2011/06/obnovlenie-mlang-dobavlena-podderzhka-delphi-4-xe/качаешь MLang для Delphi 4 - XE http://www.webdelphi.ru/wp-content/plugins/download-monitor/download.php?id=90там есть Encodings.pas в нем почти такой же класс как в юникодных делфи.
Anatoly Podgoretsky (2012-06-16 15:44:00) [10]Как же мы жили то до TEncoding?
Zheksonz (2012-06-16 13:57:00) [11]
> DVM © (14.06.12 17:59) [10]
А в Делфи 7 нельзя реализовать подобное, без класса TEncoding? А то как-то специально под него не хочется переустанавливать делфи. Да и не нашёл с ходу более или менее подходящую версию для скачивания(((
DVM (2012-06-14 17:59:00) [12]
> DVM © (14.06.12 16:53) [5]
>
> А что не так?
1. SizeOf вернет 4, а не количество байт
2. Класс TEncoding есть и в Делфи, начиная с 2009, используй его.
ProgRAMmer Dimonych (2012-06-14 17:16:00) [13]> [8] Zheksonz (14.06.12 17:11)
В D2010 RawByteString, возвращаемая UTF8Encode() определена как AnsiString. А SizeOf(AnsiString), если не ошибаюсь, есть ничто иное, как 4. Наверное, поэтому и [5].
Zheksonz (2012-06-14 17:11:00) [14]DVM © (14.06.12 16:53) [5]
А что не так? и там и там передаётся количество байтов, которое занимает посылаемая команда... Если нет, то в чём я неправ?
Zheksonz (2012-06-14 17:01:00) [15]
> DVM © (14.06.12 16:53) [5]
Я сразу предупреждаю, кто не в курсе ещё, до меня долго доходит... вы главное не нервничайте...
А по вопросу, да, но судя по уровню сарказма в вопросе я неправ(((
Zheksonz (2012-06-14 16:58:00) [16]В оригинале в integer переменную записывается байт, командой
byteval = TCPClient->Socket->ReadByte()
я пробовал
byteval := TCPClient.ReadInteger;
и
TCPClient.ReadBuffer(byteval, 1);
но выдаётся ошибка "socket error # 10054" (((
DVM (2012-06-14 16:53:00) [17]
> Zheksonz
По твоему:
Write7BitEncodedInt(SizeOf(UTF8Encode(strng)), TCPClient);
Это аналог:
Write7BitEncodedInt(Encoding->GetByteCount(String), TCPClient);
???
RWolf (2012-06-14 13:22:00) [18]зато есть ReadBuffer.
Zheksonz (2012-06-14 13:18:00) [19]в смысле непосредственно из TidTCPClienta
Zheksonz (2012-06-14 13:18:00) [20]
> RWolf © (14.06.12 13:09) [1]
> Если исходник делает Socket->ReadByte(), а перевод — ReadInteger,
> то весьма вероятно, что это не будет работать.
Да дело в том, что в Делфи вообще нет функции чтения байта((