#c# #memory #hex #decimal
#c# #память #шестнадцатеричное #десятичное
Вопрос:
Я пытаюсь понять, что такое правило для преобразования шестнадцатеричного int (десятичного) и IntrPtr.
Я где-то читал, что оно должно представлять «более высокую память» или что-то в этом роде.
Если бы кто-нибудь мог мне это немного объяснить, это было бы здорово.
Но на самом деле это примерно следующее:
Я хочу использовать SendMessage для отправки APPCOMMAND_SAVE (значение int 32).
const int WM_APPCOMMAND = 0x319;
В MS docs написано #define WM_APPCOMMAND / 0x 0 319, но это, похоже, не имеет никакого значения. У меня почему-то проблемы с нулевыми знаками. Как всегда работает 0x319.
Итак, я обнаружил, что, например, vol up равен:
const int APPCOMMAND_VOLUME_UP = 0xA0000; // 10
Теперь я пытаюсь преобразовать APPCOMMAND_SAVE (32) в правильное шестнадцатеричное значение:
const int APPCOMMAND_SAVE = 0x200000; //? Hex value of 32 is the right?
Комментарии:
1. Шестнадцатеричное значение
0x0319
идентично0x319
, таким же образом, что01000
равно1000
. Обычно мы просто отбрасываем начальные0
буквы s, потому что они не служат никакой цели2. Да, это то, что меня смущает. В какой системе счисления 10 из ms docs? Для APPCOMMAND_VOLUME_UP в качестве примера. И какое значение является правильным для APPCOMMAND_SAVE?
3. Я добавил некоторое объяснение в приведенном ниже ответе относительно того, как
lParam
это работает и почему оно записывается как0x200000
, а не0x20
4. На самом деле никто не отвечает на вопрос OPs. Целое число хранится в виде четырех байтов. Вам нужно отправить байты, и не имеет значения, является ли число десятичным или шестнадцатеричным. Десятичное или шестнадцатеричное значение применяется только при преобразовании числа в строку. Итак, все, что вам нужно сделать, это следующее: byte[] bytes = BitConverter . getBytes(число). Байты не расположены последовательно, поскольку порядок микропроцессора от самого низкого адреса памяти до самого высокого адреса равен 1,0,3,2
5. @jdweng Вы не должны отправлять байты в
SendMessage
forlParam
.lParam
должно быть определено как anIntPtr
, auint
или aulong
в зависимости от использования.
Ответ №1:
Посмотрев немного больше lParam
на WM_APPCOMMAND
вызов API, я вижу, что он содержит три отдельных значения в битовой маске:
cmd
— на какую конкретную команду приложения вы ссылаетесь [2 байта]uDevice
— который указывает устройство, сгенерировавшее ввод [2 байта]dwKeys
— который указывает, какие виртуальные клавиши нажаты, если таковые имеются [2 байта]
Значения для всех этих значений содержатся lParam
отдельно в виде битовой маски, причем каждое из них занимает 2 байта. Поэтому они структурированы lParam
следующим образом:
0xAADDKK
Где AA
указывает APPCOMMAND
отправляемое, DD
указывает uDevice
и KK
указывает dwKeys
.
Имея это в виду, чтобы отправить команду для APPCOMMAND_SAVE
(decimal 32, hex 0x20) с no uDevice
и no dwKeys
, правильное lParam
значение для использования:
0x200000
Что касается вашего другого пункта:
В документах MS указано #define WM_APPCOMMAND / 0x0319, но это, похоже, не имеет никакого значения. У меня почему-то проблемы с нулевыми знаками. Как всегда работает 0x319.
Шестнадцатеричные числа функционируют в соответствии с базой-10 в том смысле, что начальные 0
буквы s удаляются из чисел. Поэтому шестнадцатеричное 0x0319
значение совпадает с 0x319
и также 0x00000319
, точно так же, как и в base-10, 1000
является тем же числом 01000
, что и в самом деле 00000001000
.
Комментарии:
1. SendMessage(fwx, WM_APPCOMMAND, IntPtr.Zero, (IntPtr)APPCOMMAND_SAVE) — это моя функция. Это нормально?
2. А что насчет 0x20, 0x2 и 0x200000? 😉
3. @Luckylazuli Это выглядит правильно с точки зрения
lParam
, но, не видя остальной части кода, это трудно понять. КонечноAPPCOMMAND_SAVE
,0x200000
значение является правильным, указывая, что для выполнения была нажата клавиша (FAPPCOMMAND_KEY
=0x0000
)APPCOMMAND_SAVE
.4. @Luckylazuli
0x20
— это НЕ то же самое, что0x2
или0x200000
.32
,2
, и2097152
это разные числа.5. Думаю, теперь я понимаю, зачем добавлять нулевые знаки. Речь идет о семантике отображения количества цифр. Например, когда вы, например, 0100 decimal используется для выражения того, что оно может доходить до 9999. В этом отношении имеет смысл добавить избыточные нули.