Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.02.10;
Скачать: [xml.tar.bz2];

Вниз

Запись набора байтов по адресу памяти в строковую переменную   Найти похожие ветки 

 
vint45   (2008-01-14 12:26) [0]

Здраствуйте. Подскажите, плз, как записать в строковую переменную значения байтов по какому-либо адресу (например, физические значения байтов переменной типа cardinal или word)?
Я делаю примерно следующим образом:
var buf: Pointer;
begin
buf:=@aaa; \\ aaa типа cardinal, значения байтов которой следует получить
label1.Caption:=ShortString(Pointer(Cardinal(buf)-1)^);
end

Здесь не получается регулировать длину строки через приведение типов, а т.к. shortstring хранит значение длины в нулевом байте, то может получиться, что строка будет нулевого размера.
Считывание байтов через цикл тоже не совсем удобно, т.к. код становится слишком громоздким (в стороковую переменную будут записываться множество значений из других переменных)


 
Сергей М. ©   (2008-01-14 12:32) [1]

Ерунда какая-то ..

Приведи пример некоего cardinal-значения (в десятичном или шестнадцатеричном представлении) и то что ты хочешь видеть при этом в лейбле ..


 
Palladin ©   (2008-01-14 12:37) [2]


> Запись набора байтов по адресу памяти в строковую переменную

а на кой?


 
vint45   (2008-01-14 12:40) [3]

ну тогда лучше тип word, покороче будет:
физическое значение $2A02, в десятичном формате 554.
В строку загнать два символа с кодами $2A и 02. Потом символы в этой строке я переведу в шестнадцатиричный формат, функция преобразования есть.


 
Reindeer Moss Eater ©   (2008-01-14 12:41) [4]

а на кой?
Чтобы потом на форуме спрашивать:
"А чо это я там ничего не вижу в этой моей чудо-строке?!"
:)))


 
Palladin ©   (2008-01-14 12:42) [5]

то есть ты загоняешь в строку только для преобразования в шестнадцатиричный формат? а сразу то не судьба?


 
Reindeer Moss Eater ©   (2008-01-14 12:43) [6]

В строку загнать два символа с кодами $2A и 02.
А если целое будет например такое: $2020 ?
Что будешь делать с нулевым байтом посреди своей строки?


 
Сергей М. ©   (2008-01-14 12:47) [7]


> vint45   (14.01.08 12:40) [3]


> В строку загнать два символа с кодами $2A и 02


За каким лешим ?
Сразу преобразовывай с пом. IntToHex, или BinToHex (смотря что удобней) , а результат преобразования "загоняй" в строку (хотя это и так уже строка, не знаю что ты там еще загонять собрался)


 
vint45   (2008-01-14 12:49) [8]


> Reindeer Moss Eater ©   (14.01.08 12:43) [6]

ну строка не PChar, содержать нулевой символ я думаю может

> Palladin ©   (14.01.08 12:42) [5]

передо мной стоит задача отображения в лэйбле (в шеснадцатиричном формате) содержимого памяти по некоемому физическому адресу ) как реализовать, пока не знаю


 
Palladin ©   (2008-01-14 12:50) [9]

ну так вот, тебе Сергей М. уже сказал


 
Сергей М. ©   (2008-01-14 12:52) [10]

лэйбл.кэпшн := IntToHex(Value, SizeOf(Value)*2);


 
Reindeer Moss Eater ©   (2008-01-14 12:54) [11]

передо мной стоит задача отображения в лэйбле (в шеснадцатиричном формате) содержимого памяти по некоемому физическому адресу ) как реализовать, пока не знаю

<Цитата>

Данные уже в памяти. На.. зачем их переливать в строку?
PWord, PByte etc на начало блока и вперед и в цикле IntToHex


 
oxffff ©   (2008-01-14 13:03) [12]


> Сергей М. ©   (14.01.08 12:52) [10]
> лэйбл.кэпшн := IntToHex(Value, SizeOf(Value)*2);


Поясните SizeOf(Value)*2


 
Palladin ©   (2008-01-14 13:08) [13]

по одному символу на полубайт


 
Сергей М. ©   (2008-01-14 13:11) [14]


> oxffff ©   (14.01.08 13:03) [12]


Что пояснить ?
Тип заранее известен - Cardinal или Word.
Компилятор сам расчитает значение длины результ.строки.


 
oxffff ©   (2008-01-14 13:13) [15]


> Palladin ©   (14.01.08 13:08) [13]


Digits indicates the minimum number of hexadecimal digits to return.


 
oxffff ©   (2008-01-14 13:16) [16]


> Сергей М. ©   (14.01.08 13:11) [14]


А понял, куда это вы.


 
vint45   (2008-01-14 15:29) [17]


> Сергей М. ©   (14.01.08 12:52) [10]

Спасибо. Примерно то, что надо. Только функция IntToHex меняет местами байты при записи в строку. Т.е. физически байт 2А имеет меньший адрес чем 02 (2А логично было бы отображать левее), а при конвертации получается 02 идет первым. В принципе понятно почему.

Многие спрашивают, зачем мне все это надо ) Попробую ответить.
Имеется файл. В него записаны значения целого ряда переменных. Причем эти значения записаны без преобразования к какому-либо формату (дамп памяти). Все эти переменные имеют типы не имеющие аналогов в паскале (unsigned long, short, bcd и т.д.). Описания типов, кроме их названий, у меня нет. Вот эти значения мне надо считать в свою программу, попытаться привести их к паскалевским типам. А для наглядности, в строковую переменную выводить реальные значения считанные из файла. Чтобы, если возникнут какие-то вопросы, можно было бы провести анализ.
Я сначала считываю в переменную с заданным типом через файловый поток:
var aaa: cardinal;
begin
sFile.Read(aaa,SizeOf(aaa)); // считываем 4 байта из файла, соответствующие типу unsigned long

потом можно теже 4 байта считать в строку через ф-ю Setlength, seek -4 байта, и опять Read в уже строку. Но это имхо не красиво, зачем 2 раза из файла считывать одно и тоже, вот я и пытаюсь получить уже считанное значение из переменной.


 
Сергей М. ©   (2008-01-14 15:40) [18]


> vint45   (14.01.08 15:29) [17]



> функция IntToHex меняет местами байты при записи в строку


Диагноз и приговор: цикл


 
vint45   (2008-01-14 15:51) [19]

да.. раз так, то так, спасибо еще раз


 
Anatoly Podgoretsky ©   (2008-01-14 16:16) [20]

> vint45  (14.01.2008 15:29:17)  [17]

Ничего не меняет, это ты работаешь как с кардинал, а видеть хочешь как array of byte,  для таких ленивых есть BinToHex


 
vint45   (2008-01-14 17:57) [21]

да BinToTex действительно работает, только у меня почему-то в конце добаляется лишний символ в конце, делаю так:
var c: PChar;
begin
c:=StrAlloc(SizeOf(aaa)*2);
BinToHex(PChar(@aaa),c,SizeOf(aaa));
рельтат для aaa=127 (cardinal) - 7F 00 00 00 + в конце еще один спецсимвол


хотя в принципе, я уже функцию накатал через циклы.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.02.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.103 c
2-1200415604
Michael
2008-01-15 19:46
2008.02.10
Преобразование word a в 2 byte a


2-1200234821
cr@nk
2008-01-13 17:33
2008.02.10
Консольное приложение (пара вопросов)


15-1199907116
Rouse_
2008-01-09 22:31
2008.02.10
Махонькое обновление моего ресурса


15-1200079941
necromancer
2008-01-11 22:32
2008.02.10
Создать аякс-лоадер


2-1200490770
NaRuTo
2008-01-16 16:39
2008.02.10
Преобразование!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский