![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Народ, подскажите плиз, как строку типа Widestring преобразовать в массив байт, причем интересует полный массив, т.е. мне надо получить не просто массив из WideChar-символов, а полный массив строке, т.е. так, как она выглядит в памяти... Например строка ABCD в памяти представлена как 41 00 42 00 43 00 44 00 00 00 - мне нужно получить в массиве именно такое представление строки. Сорри за возможно несколько сумбурное изложение, но, надеюсь, понятно.
|
|
#2
|
||||
|
||||
|
Даже не знаю...
Зато я знаю как можно конвертировать WideString в String: Код:
{
Converts Unicode string to Ansi string using specified code page.
@param ws Unicode string.
@param codePage Code page to be used in conversion.
@returns Converted ansi string.
}
function WideStringToString(const ws: WideString; codePage: Word): AnsiString;
var
l: integer;
begin
if ws = '' then
Result := ''
else
begin
l := WideCharToMultiByte(codePage,
WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
@ws[1], -1, nil, 0, nil, nil);
SetLength(Result, l - 1);
if l > 1 then
WideCharToMultiByte(codePage,
WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
@ws[1], -1, @Result[1], l - 1, nil, nil);
end;
end; { WideStringToString }
{:Converts Ansi string to Unicode string using specified code page.
@param s Ansi string.
@param codePage Code page to be used in conversion.
@returns Converted wide string.
}
function StringToWideString(const s: AnsiString; codePage: Word): WideString;
var
l: integer;
begin
if s = '' then
Result := ''
else
begin
l := MultiByteToWideChar(codePage, MB_PRECOMPOSED, PChar(@s[1]), -1, nil,
0);
SetLength(Result, l - 1);
if l > 1 then
MultiByteToWideChar(CodePage, MB_PRECOMPOSED, PChar(@s[1]),
-1, PWideChar(@Result[1]), l - 1);
end;
end; { StringToWideString } |
|
#3
|
|||
|
|||
|
Не, в стринг конвертить не надо... Теоретически можно попробовать с указателями сделать но вот как я пока не могу ума приложить...
![]() |
|
#4
|
||||
|
||||
|
Насколько я знаю строка это уже готовый массив символов, т.е. чтоб получить определенное значение пишем
Код:
var b : Byte; s : String; ........... s := ' ABC'; b := Ord(s[1]); // в переменной b будет число 32. |
|
#5
|
||||
|
||||
|
Похоже надо будет из WideString конвертировать в String, а из String в массив байтов.
|
|
#6
|
|||
|
|||
|
Народ, в этом-то и проблема, если сконвертить WideString в String то получим строку с символами в однобайтовой кодировке, меня же интересует получить массив, содержащий символы в двухбайтовой кодировке юникод. Честно говоря я представляю процесс себе примерно так - берем указатель на строку widestring, читаем из памяти, адресуемой указателем данные до тех пор, пока не встретим 00 00 - признак конца строки. Только вопрос в том, как читать данные из памяти, адресуемые указателем? С этим никак не могу разобраться
![]() |
|
#7
|
|||
|
|||
|
Вот как можно увидеть данные (string):
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
SWide: WideString;
S: String;
I: Integer;
begin
SWide:= WideString('ABC');
S:= '';
for I:= 1 to Length(SWide) do
S:= S + IntToHex(Ord(SWide[i]), 4) + ' ';
Edit1.Text:= S; // 0041 0042 0043
end; |
|
#8
|
|||
|
|||
|
Спасибо огроменное! Это именно то, что мне нужно!!!
|
|
#9
|
||||
|
||||
|
Всегда пожалуйста!
|