|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Проебразовать WindeString в массив байт... Как?
Народ, подскажите плиз, как строку типа 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. Не профи, но и не чайник . D6 - лучше не придумали. Пока. |
#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
|
||||
|
||||
Всегда пожалуйста!
|