2009-03-13 5 views
0

я выделения блока памяти в C# для извлечения информации из неуправляемого буфера данных:Получите количество байтов, хранящихся в блоке памяти?

handle = Marshal.AllocHGlobal(33455); 

Максимальный размер информации, извлеченной является 33,455 байт, но размер информации может быть меньше, чем в некоторых случаях.

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

ответ

4

Как система должна знать, какие данные используются в случайном порядке? Он ничего не знает о структуре ваших данных. Все, что он знает, это то, сколько вы выделили. Вы не храните байты в дескрипторе. Этот дескриптор относится только к фрагменту памяти, который был выделен для вас.

Вы можете инициализировать данные до значения часового (например, 0xcdcdcdcd, которое Windows будет делать в режиме отладки), а затем вы можете его вычислить. Или, если данные являются строкой, вы можете вызвать strlen() (или одну из безопасных строковых функций). Или вы можете написать некоторые функции-обертки, которые обертывают API-интерфейсы, которые вы используете для записи в память, и отслеживайте, сколько данных вы используете.

+0

Единственная проблема заключается в том, что система, из которой я получаю данные, не может сказать мне размер данных, которые он написал. Я могу отслеживать, как мои изменения, но как только неуправляемая система записывает некоторые данные, это испортит мои вычисления. Думаю, я просто СОЛ? :( –

+0

В значительной степени ... с негабаритным буфером, самые разумные API возвратят вам количество * используемых * байтов. Сравните с Stream.Read и т. Д. –

+0

Спасибо! Я думаю, что я просто копаю немного глубже в API и посмотреть, есть ли какая-то функция, которую я где-то не вижу. –

1

Согласно документации на MSDN в

http://msdn.microsoft.com/en-us/library/s69bkh17.aspx

Вы либо получите, что память выделяется, или вы будете получить из исключения памяти, если запрос не может быть завершена.

Таким образом, ответ на ваш вопрос в том, что вы либо: 1) Есть 33455 байт памяти, выделенной и ссылки с помощью «ручки», или ... 2) из ​​исключения памяти будет поднята, и вы будете иметь нулевые байты памяти, выделенные и связанные с помощью «handle».

На этом очень низком уровне это все, что вы знаете.

Вы можете либо сохранить счет в начале блока, чтобы указать, сколько вы использовали, либо использовать значения дозорных средств, как было предложено.

+0

Честно говоря, я не оцените бит «Let Me Google That For You». Google, конечно, первое, что я пробовал, но мой вопрос заключался не в том, чтобы прочитать, сколько было выделено (что я уже знаю), но о том, сколько из этого выделенного блока фактически используется *. –

+0

Очень хорошо, это было, вероятно, совершенно бестактно для меня, чтобы сделать это, и вы правы - я неправильно читаю оригинальный вопрос - сколько стоит _used_. – Arafangion

+0

Я перечитал свой вопрос и решил, что это, вероятно, немного неясно, поэтому я его отредактировал. Спасибо, что убрали ссылку LMGTFY. –

Смежные вопросы