Как передать номер слова в строку?

Прежде всего, я сожалею, что не могу лучше описать свою проблему.

У меня есть номер слова 65025, который равен 0xFE01 или 11111110 00000001 в двоичном формате. И я хочу передать значение wstr Word => 11111110 00000001.

Я обнаружил, что использование typecast не работает.

И еще один вопрос здесь. Если я хочу добавить еще один номер, например 10000 => 0x03E8, как это сделать. Таким образом, в результате широкая строка должна ссылаться на значения 0xFE01 0x03E8.

И затем, как получить те же числа из широкой строки в слово обратно?

var wstr: Widestring;
wo: Word;
begin
  wo := 65025;
  wstr := Widestring(wo);
  wo := 10000;
  wstr := wstr + Widestring(wo);
end

Изменить:

Я даю другой, более простой пример того, что я хочу... Если у меня есть значение слова 49, которое равно значению ASCII 1, то я хочу, чтобы wstr был равен '1', что равно b00110001 в двоичном выражении. Я хочу скопировать биты из номера слова в строку.


person John Boe    schedule 07.07.2018    source источник
comment
Попробуйте гуглить с помощью int для строки двоичного паскаля delphi   -  person Zamrony P. Juhara    schedule 07.07.2018
comment
@Zamrony P. Juhara: возможно ли скопировать все 8 или 16 битов за один раз? Я нашел пример, который копирует биты в цикле, который имеет 8 шагов.   -  person John Boe    schedule 07.07.2018
comment
Да, вы можете использовать 8-битную двоичную строку как 16-битную двоичную строку, поставив нули в старшие биты   -  person Zamrony P. Juhara    schedule 07.07.2018
comment
Итак, ваш вопрос: как преобразовать целое число в его двоичное представление?   -  person David Heffernan    schedule 07.07.2018
comment
@ Дэвид Хеффернан: я хочу скопировать биты из слова в широкую строку.   -  person John Boe    schedule 07.07.2018
comment
Никто не понимает, что вы хотите сделать. Дело не в том, что мы вас не понимаем. Вы не объясняете себя.   -  person David Heffernan    schedule 07.07.2018
comment
@David Heffenan: я описал это в двоичном виде: и я хочу передать значение в wstr Word => 11111110 00000001. Я хочу скопировать биты из слова в wstr. Таким образом, первые два символа wstr должны иметь двоичное значение, как я описал. Результат не «1111111000000001», а двоичный 1111111000000001 или в шестнадцатеричном виде: 0xFE01 0x03E8 ... Или другой пример, если слово равно 49, тогда wstr должно быть «1», потому что код ascii для «1» равен 49 или b00110001   -  person John Boe    schedule 07.07.2018
comment
Хорошо, теперь ясно. Я дал вам ответ.   -  person David Heffernan    schedule 07.07.2018


Ответы (2)


Похоже, вы хотите интерпретировать слово как единицу кода UTF-16. В Unicode Delphi вы должны использовать функцию Chr(). Но я подозреваю, что вы используете ANSI Delphi. В этом случае приведите к WideChar с WideChar(wo).

person David Heffernan    schedule 07.07.2018

Вы переводите Word в WideString. В Delphi приведение обычно не преобразуется, поэтому вы просто интерпретируете значение 65025 как указатель (WideString — это указатель). Но 65025 не является допустимым значением указателя.

Вам нужно будет явно преобразовать Word в WideString, например. с такой функцией (не проверено, но должно работать):

function WordToBinary(W: Word): WideString;
var
  I: Integer;
begin
  Result := '0000000000000000';
  for I := 0 to 15 do // process bits 0..15
  begin
    if Odd(W) then
      Result[16 - I] := '1';
    W := W shr 1;
  end;
end;

Теперь вы можете сделать что-то вроде:

wo := 65025; 
wstr := WordToBinary(wo);
wo := 10000;
wstr := wstr + ' ' + WordToBinary(wo);

Для обратного вам придется написать функцию, которая преобразует из WideString в Word. Я оставлю это упражнение вам.

Опять же, вы не можете бросить. Вам придется явно конвертировать. Оба способа.

person Rudy Velthuis    schedule 07.07.2018
comment
К сожалению, вы меня не поняли. В примере вы должны скопировать 16 бит из числового слова в широкую строку. Я как раз искал подходящие термы. Что-то вроде этого псевдокода: ` function WordToBinary(num: Word): WideString; begin for i:=0 to 15 do Result := num shr 1; конец; ` Но это вызывает ошибку... [Ошибка] Несовместимые типы: 'WideString' и 'Integer' - person John Boe; 07.07.2018
comment
видите, вы приняли ответ Дэвида. Если это то, чего ты хочешь, то ты должен был так сказать. Упоминание о бинарных значениях и приведении к WideString сильно запутало. Просто сделайте wstr := WideChar(65025) + WideChar(10000);. - person Rudy Velthuis; 07.07.2018
comment
да. Это все мелочи :-) - person John Boe; 07.07.2018