Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Преобразавоние статического массива в TBytes / 11 сообщений из 11, страница 1 из 1
11.06.2020, 19:42
    #39968377
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразавоние статического массива в TBytes
Есть такая структура
Код: pascal
1.
2.
3.
4.
TData = record
  Len: SmallInt;
  Data: array[0..1000] of Byte;
end;


Нужно эту структуру скормить в TEncoding, которая принимает TBytes (метод, который принимает указатели, приватный).

Как бы это сделать без Move()?

Преобразование нужно в две стороны: в строку и из строки.

Длина SmallInt (два байта) ограничивается внешним протоколом.

С уважением, Vasilisk
...
Рейтинг: 0 / 0
11.06.2020, 19:50
    #39968381
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразавоние статического массива в TBytes
_Vasilisk_
Код: pascal
1.
TData = record


_Vasilisk_
TEncoding

_Vasilisk_
TBytes

_Vasilisk_
в строку и из строки

Что?
...
Рейтинг: 0 / 0
11.06.2020, 20:03
    #39968389
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразавоние статического массива в TBytes
wadman
Что?
Хочется
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
var
  LEnc: TEncoding;
  LData: TData;
  LStr: string;
begin
  LStr := LEnc.GetString(LData.Data, 0, LData.Len);
  //---------
  LData.Len := LEnc.GetBytes(LStr, 0, Length(LStr), LData.Data, 0);
end;

при том, что есть объявление
Код: pascal
1.
2.
3.
4.
5.
6.
7.
TEncoding = class
  ..............
    function GetBytes(const S: string; CharIndex, CharCount: Integer;
      const Bytes: TBytes; ByteIndex: Integer): Integer; overload; inline;
    function GetString(const Bytes: TBytes; ByteIndex, ByteCount: Integer): string; overload;
  ...........
end;


сейчас все приходится делать через промежуточную переменную TBytes
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var
  LEnc: TEncoding;
  LBt: TBytes;
  LData: TData;
  LStr: string;
begin
  SetLength(LBt, LData.Len);
  Move(LData.Data[0], LBt[0], LData.Len);
  LStr := LEnc.GetString(LBt, 0, LData.Len);
  //---------
  LBt := LEnc.GetBytes(LStr);
  LData.Len := Length(LBt);
  Move(LBt[0], LData.Data[0], LData.Len);
end;
...
Рейтинг: 0 / 0
11.06.2020, 21:05
    #39968396
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразавоние статического массива в TBytes
В смысле зачем кодировка, если не используется информация о ней при передаче?
...
Рейтинг: 0 / 0
11.06.2020, 21:05
    #39968397
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразавоние статического массива в TBytes
absolute? вариантные записи?
...
Рейтинг: 0 / 0
11.06.2020, 23:43
    #39968432
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразавоние статического массива в TBytes
Никак
...
Рейтинг: 0 / 0
12.06.2020, 00:03
    #39968436
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразавоние статического массива в TBytes
Есть два способа:

Код: pascal
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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type

 TEncodingHelper = class helper for TEncoding

  public

   function GetString1(const ABytes : array of Byte) : string;

 end;

 TEncodingEx = class(TEncoding)

  public

   function GetString2(const ABytes : array of Byte) : string;

 end;

{ TEncodingHelper }

function TEncodingHelper.GetString1(const ABytes : array of Byte) : string;
begin

 Result := '';

 SetLength(Result, Self.GetCharCount(@ABytes, Length(ABytes)));
 Self.GetChars(@ABytes, Length(ABytes), Pointer(Result), Length(Result));

end;

{ TEncodingEx }

function TEncodingEx.GetString2(const ABytes : array of Byte) : string;
begin

 Result := '';

 SetLength(Result, Self.GetCharCount(@ABytes, Length(ABytes)));
 Self.GetChars(@ABytes, Length(ABytes), Pointer(Result), Length(Result));

end;

var

 bytes : array [0 .. 1023] of Byte;

begin

 writeLn(TEncoding.ASCII.GetString1([ord('A'), ord('B'), ord('c')]));
 writeLn(TEncodingEx(TEncoding.UTF8).GetString2([ord('D'), ord('E'), ord('f')]));

 bytes[0] := ord('s');
 bytes[1] := ord('i');
 bytes[2] := ord('m');
 bytes[3] := ord('p');
 bytes[4] := ord('l');
 bytes[5] := ord('e');

 writeLn(TEncoding.ASCII.GetString1(Slice(bytes, 6)));
 writeLn(TEncodingEx(TEncoding.UTF8).GetString2(Slice(bytes, 6)));

 readln;

end.
...
Рейтинг: 0 / 0
12.06.2020, 00:16
    #39968439
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразавоние статического массива в TBytes
_Vasilisk_,

Заменить TData на TBytes в том месте где используете TData... Делов-то..
...
Рейтинг: 0 / 0
12.06.2020, 12:57
    #39968532
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразавоние статического массива в TBytes
wadman
В смысле зачем кодировка, если не используется информация о ней при передаче?
Она передается в отдельном пакете. Информация о ней у меня есть
makhaon
absolute?
Нет. У статических массивов нет отрицательного смещения где хранится длина
Kazantsev Alexey
Есть два способа:
Точно! Спасибо. Что-то я перестал соображать.

Только второй способ работать не будет, потому, что GetChars с указателями у базового TEncoding абстрактный

X-Cite
Заменить TData на TBytes в том месте где используете TData... Делов-то..
Еще раз повторяю
_Vasilisk_
Длина SmallInt (два байта) ограничивается внешним протоколом.
Формат TData определяется не мной
...
Рейтинг: 0 / 0
12.06.2020, 13:24
    #39968540
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразавоние статического массива в TBytes
_Vasilisk_
Только второй способ работать не будет, потому, что GetChars с указателями у базового TEncoding абстрактный

Будет. Вызовы виртуальных методов резолвятся через VMT, а в VMT класса твоего объекта всё прописано. Кстати, второй способ более предпочтительный.
...
Рейтинг: 0 / 0
12.06.2020, 13:59
    #39968552
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразавоние статического массива в TBytes
Kazantsev Alexey
Будет.
Прошу прошения. Не увидел явного каста.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Преобразавоние статического массива в TBytes / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]