Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.09.2007, 22:42
s.Mobi s.Mobi вне форума
Прохожий
 
Регистрация: 02.09.2007
Сообщения: 14
Репутация: 10
Вопрос Проебразовать WindeString в массив байт... Как?

Народ, подскажите плиз, как строку типа Widestring преобразовать в массив байт, причем интересует полный массив, т.е. мне надо получить не просто массив из WideChar-символов, а полный массив строке, т.е. так, как она выглядит в памяти... Например строка ABCD в памяти представлена как 41 00 42 00 43 00 44 00 00 00 - мне нужно получить в массиве именно такое представление строки. Сорри за возможно несколько сумбурное изложение, но, надеюсь, понятно.
Ответить с цитированием
  #2  
Старый 02.09.2007, 22:48
Аватар для Winny
Winny Winny вне форума
Продвинутый
 
Регистрация: 26.05.2007
Адрес: Планета земля, Россия, Москва
Сообщения: 620
Репутация: 30
По умолчанию

Даже не знаю...
Зато я знаю как можно конвертировать 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  
Старый 02.09.2007, 23:39
s.Mobi s.Mobi вне форума
Прохожий
 
Регистрация: 02.09.2007
Сообщения: 14
Репутация: 10
По умолчанию

Не, в стринг конвертить не надо... Теоретически можно попробовать с указателями сделать но вот как я пока не могу ума приложить...
Ответить с цитированием
  #4  
Старый 03.09.2007, 01:57
Аватар для zip000
zip000 zip000 вне форума
Начинающий
 
Регистрация: 24.07.2007
Сообщения: 194
Репутация: 25
По умолчанию

Насколько я знаю строка это уже готовый массив символов, т.е. чтоб получить определенное значение пишем
Код:
var
  b : Byte;
  s : String;
...........
  s := ' ABC';
  b := Ord(s[1]); // в переменной b будет число 32.
Ну а WideString в String см. выше.
__________________
Не профи, но и не чайник . D6 - лучше не придумали. Пока.
Ответить с цитированием
  #5  
Старый 03.09.2007, 10:52
Аватар для Winny
Winny Winny вне форума
Продвинутый
 
Регистрация: 26.05.2007
Адрес: Планета земля, Россия, Москва
Сообщения: 620
Репутация: 30
По умолчанию

Похоже надо будет из WideString конвертировать в String, а из String в массив байтов.
__________________

Ответить с цитированием
  #6  
Старый 03.09.2007, 11:09
s.Mobi s.Mobi вне форума
Прохожий
 
Регистрация: 02.09.2007
Сообщения: 14
Репутация: 10
По умолчанию

Народ, в этом-то и проблема, если сконвертить WideString в String то получим строку с символами в однобайтовой кодировке, меня же интересует получить массив, содержащий символы в двухбайтовой кодировке юникод. Честно говоря я представляю процесс себе примерно так - берем указатель на строку widestring, читаем из памяти, адресуемой указателем данные до тех пор, пока не встретим 00 00 - признак конца строки. Только вопрос в том, как читать данные из памяти, адресуемые указателем? С этим никак не могу разобраться
Ответить с цитированием
  #7  
Старый 05.09.2007, 10:22
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Вот как можно увидеть данные (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  
Старый 07.09.2007, 21:27
s.Mobi s.Mobi вне форума
Прохожий
 
Регистрация: 02.09.2007
Сообщения: 14
Репутация: 10
По умолчанию

Спасибо огроменное! Это именно то, что мне нужно!!!
Ответить с цитированием
  #9  
Старый 07.09.2007, 21:49
Аватар для Winny
Winny Winny вне форума
Продвинутый
 
Регистрация: 26.05.2007
Адрес: Планета земля, Россия, Москва
Сообщения: 620
Репутация: 30
По умолчанию

Всегда пожалуйста!
__________________

Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:50.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter