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


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

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

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

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

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


_Vasilisk_
TEncoding

_Vasilisk_
TBytes

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

Что?
...
Рейтинг: 0 / 0
Преобразавоние статического массива в TBytes
    #39968389
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Преобразавоние статического массива в TBytes
    #39968396
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В смысле зачем кодировка, если не используется информация о ней при передаче?
...
Рейтинг: 0 / 0
Преобразавоние статического массива в TBytes
    #39968397
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
absolute? вариантные записи?
...
Рейтинг: 0 / 0
Преобразавоние статического массива в TBytes
    #39968432
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никак
...
Рейтинг: 0 / 0
Преобразавоние статического массива в TBytes
    #39968436
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть два способа:

Код: 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
Преобразавоние статического массива в TBytes
    #39968439
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

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

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

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

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


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