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

Где я могу найти все сведения о формате чисел? Я хочу узнать, какой должен быть первый символ. Обычно числа такого вида 07fffff000h или 1ff000000h. Мой конкретный вопрос - может ли число начинаться с символа "А", например А100000000000000h, или в таком случае "0" будет на первом месте?

Существуют ли методы или классы для парсинга чисел неизвестного формата из потока? Я уверен, что они существуют.

Существует ли в C# универсальный парсер для всех возможных чисел? У меня возникла необходимость создавать собственные методы каждый раз, что довольно неудобно. Некоторые примеры чисел, которые я хотел бы парсить, включают в себя:
- double 0.121221
- int 0xaa (почему C# не парсит такие числа? Мне приходится сдвигать их на 2)
- int 00aah
- int aa
- int 10
- int 10u (с различными знаками после числа)
- int 0и010101100100100101010

Я хотел бы иметь функцию или библиотеку, которая возвращает что-то подобное:
Token magic_func(Stream s);  // обычно строк 200-400 машина состояний, реализовывал для всех форматов, но грязно.
DoubleToken:Token{
 double Numb;
}
IntegerToken:Token{
 int Numb;
}
  • 15 сентября 2023 г. 19:57
Ответы на вопрос 2
В формате чисел в ассемблерных файлах с суффиксом 'h', 'h' обозначает, что число записано в шестнадцатеричной системе счисления. Шестнадцатеричные числа состоят из цифр от 0 до 9 и букв от A до F. 

Примеры чисел в формате '000ABC100h' указывают на число 0x000ABC100, что в десятичной системе равно 70449792.

Первый символ числа может быть любой цифрой или буквой, и он указывает на базовое значение числа. Если первый символ числа является буквой 'A', это означает, что число начинается с 10. 

Для разбора чисел в таком формате в C# вы можете использовать методы парсинга. Для шестнадцатеричных чисел вы можете использовать метод `int.Parse()` или `Convert.ToInt32()`, указав второй параметр как `NumberStyles.HexNumber`. Например:

```csharp
string numberString = "000ABC100h";
int number = int.Parse(numberString.Replace("h", ""), NumberStyles.HexNumber);
Console.WriteLine(number);
```

Вывод:

```
70449792
```

Относительно вашего вопроса о парсинге чисел неизвестного формата из потока, в C# существует возможность работы с регулярными выражениями с использованием класса `Regex`. Вы можете определить шаблон для каждого типа числа и использовать методы класса `Regex` для поиска и извлечения чисел из строки.
В каждом языке программирования есть свои числовые литералы, например, в языке C# или ассемблере. При работе с шестнадцатеричной системой счисления, числа могут содержать цифры от 0 до 9 и буквы от A до F. Важно помнить, что в различных регистрах процессора или при использовании разных типов данных в языке C#, имеется ограниченный диапазон значений, которые могут быть представлены. Например, для ассемблерного двойного слова (DWORD) максимальное значение составляет FFFFFFFFh. А для беззнакового длинного целого числа (unsigned long) в C# максимальное значение составляет 0xFFFF_FFFF_FFFF_FFFF. При проверке допустимости числа важно учитывать как правильность символов, так и соответствие диапазону типа данных.
Похожие вопросы