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

<p>как вы конвертируете между шестнадцатеричными и десятичными числами в c #?</p>

<p>для преобразования из десятичного в шестнадцатеричное сделать ...</p><pre><code>string hexvalue = decvalue.tostring("x"); </code></pre><p>чтобы преобразовать из шестнадцатеричного в десятичное, сделайте либо.</p><pre><code>int decvalue = int.parse(hexvalue, system.globalization.numberstyles.hexnumber); </code></pre><p>или же</p><pre><code>int decvalue = convert.toint32(hexvalue, 16); </code></pre>

<p>шестнадцатеричный -> десятичный:</p><pre><code>convert.toint64(hexvalue, 16); </code></pre><p>десятичный -> шестнадцатеричный</p><pre><code>string.format("{0:x}", decvalue); </code></pre>

<p>похоже, вы можете сказать</p><pre><code>convert.toint64(value, 16) </code></pre><p>чтобы получить десятичную от шестнадцатеричной.</p><p>и наоборот:</p><pre><code>othervar.tostring("x"); </code></pre>

<p>если вам нужна максимальная производительность при преобразовании из шестнадцатеричного в десятичное число, вы можете использовать подход с предварительно заполненной таблицей шестнадцатеричных значений.</p><p>вот код, который иллюстрирует эту идею. мой <a href="http://vadmyst.blogspot.com/2012/02/fast-convertion-of-hex-string-into.html">тесты производительности</a> показал, что он может быть на 20% -40% быстрее, чем convert.toint32 (...):</p><pre><code>class tableconvert { static sbyte[] unhex\_table = { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 , 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1 ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 }; public static int convert(string hexnumber) { int decvalue = unhex\_table[(byte)hexnumber[0]]; for (int i = 1; i < hexnumber.length; i++) { decvalue *= 16; decvalue += unhex\_table[(byte)hexnumber[i]]; } return decvalue; } } </code></pre>

<p> <a href="https://web.archive.org/web/20081231062758/http://www.geekpedia.com/kb8\_how-do-i-convert-from-decimal-to-hex-and-hex-to-decimal.html">из geekpedia</a> :</p><pre><code>// store integer 182 int decvalue = 182; // convert integer 182 as a hex in a string variable string hexvalue = decvalue.tostring("x"); // convert the hex string back to the number int decagain = int.parse(hexvalue, system.globalization.numberstyles.hexnumber); </code></pre>

<pre><code> static string chex(byte e) // convert a byte to a string representing that byte in hexadecimal { string r = ""; string chars = "0123456789abcdef"; r += chars[e >> 4]; return r += chars[e &= 0x0f]; } // easy enough... static byte crazy\_byte(string t, int i) // take a byte, if zero return zero, else throw exception (i=0 means false, i>0 means true) { if (i == 0) return 0; throw new exception(t); } static byte hbyte(string e) // take 2 characters: these are hex chars, convert it to a byte { // warning: this code will make small children cry. rated r. e = e.toupper(); // string msg = "invalid chars"; // the message that will be thrown if the hex str is invalid byte[] t = new byte[] // gets the 2 characters and puts them in seperate entries in a byte array. { // this will throw an exception if (e.length != 2). (byte)e[crazy\_byte("invalid length", e.length ^ 0x02)], (byte)e[0x01] }; for (byte i = 0x00; i < 0x02; i++) // convert those [ascii] characters to [hexadecimal] characters. error out if either character is invalid. { t[i] -= (byte)((t[i] >= 0x30) ? 0x30 : crazy\_byte(msg, 0x01)); // check for 0-9 t[i] -= (byte)((!(t[i] < 0x0a)) ? (t[i] >= 0x11 ? 0x07 : crazy\_byte(msg, 0x01)) : 0x00); // check for a-f } return t[0x01] |= t[0x00] <<= 0x04; // the moment of truth. } </code></pre>

<p>преобразование шестнадцатеричного в десятичное</p><pre><code>convert.toint32(number, 16); </code></pre><p>десятичное в шестнадцатеричное преобразование</p><pre><code>int.parse(number, system.globalization.numberstyles.hexnumber) </code></pre><p> <a href="http://kodecenter.com/article?id=f3ed25f1-2563-4323-9f43-c4fbbc9c372f">подробнее читайте в этой статье</a> </p>

<p>это не совсем простой способ, но этот исходный код позволяет вам исправить любые типы восьмеричных чисел, то есть 23.214, 23 и 0.512 и так далее. надеюсь, что это поможет вам..</p><pre><code> public string octal\_to\_decimal(string m\_value) { double i, j, x = 0; int64 main\_value; int k = 0; bool pw = true, ch; int position\_pt = m\_value.indexof("."); if (position\_pt == -1) { main\_value = convert.toint64(m\_value); ch = false; } else { main\_value = convert.toint64(m\_value.remove(position\_pt, m\_value.length - position\_pt)); ch = true; } while (k <= 1) { do { i = main\_value % 10; // return remainder i = i * convert.todouble(math.pow(8, x)); // calculate power if (pw) x++; else x--; o\_to\_d = o\_to\_d + i; // saving required calculated value in main variable main\_value = main\_value / 10; // dividing the main value } while (main\_value >= 1); if (ch) { k++; main\_value = convert.toint64(reversestring(m\_value.remove(0, position\_pt + 1))); } else k = 2; pw = false; x = -1; } return (convert.tostring(o\_to\_d)); } </code></pre>

<pre><code>string stringrep = myintvar.tostring("x"); int num = int.parse("ff", system.globalization.numberstyles.hexnumber); </code></pre>

<p>попробуйте использовать bignumber в c # - представляет произвольно большое целое число со знаком.</p><h3>программа</h3><pre><code>using system.numerics; ... var bignumber = biginteger.parse("837593454735734579347547357233757342857087879423437472347757234945743"); console.writeline(bignumber.tostring("x")); </code></pre><h3>результат</h3><pre><code>4f30dc39a5b10a824134d5b18eea3707ac854ee565414ed2e498dcfde1a15da5feb6074ae248458435bd417f06f674eb29a2cfecf </code></pre><h3>возможные исключения,</h3><p>argumentnullexception - значение является нулем.</p><p>formatexception - значение не в правильном формате.</p><h3>заключение</h3><p>вы можете преобразовать строку и сохранить значение в bignumber без ограничений на размер числа, если строка не пуста и не содержит аналфабетов.</p>

<p>вот моя функция:</p><pre><code>using system; using system.collections.generic; class hexadecimaltodecimal { static dictionary<char, int> hexdecval = new dictionary<char, int>{ {'0', 0}, {'1', 1}, {'2', 2}, {'3', 3}, {'4', 4}, {'5', 5}, {'6', 6}, {'7', 7}, {'8', 8}, {'9', 9}, {'a', 10}, {'b', 11}, {'c', 12}, {'d', 13}, {'e', 14}, {'f', 15}, }; static decimal hextodec(string hex) { decimal result = 0; hex = hex.tolower(); for (int i = 0; i < hex.length; i++) { char valat = hex[hex.length - 1 - i]; result += hexdecval[valat] * (int)math.pow(16, i); } return result; } static void main() { console.writeline("enter hexadecimal value"); string hex = console.readline().trim(); //string hex = "29a"; console.writeline("hex {0} is dec {1}", hex, hextodec(hex)); console.readkey(); } } </code></pre>

<p>преобразовать двоичный код в шестнадцатеричный</p><pre><code>convert.tostring(convert.touint32(binary1, 2), 16).toupper() </code></pre>

<p>если это действительно большая шестнадцатеричная строка, выходящая за рамки обычного целого числа:</p><p>для .net 3.5 мы можем использовать класс biginteger bouncycastle:</p><pre><code>string hex = "68c7b05d0000000002f8"; // results in "494809724602834812404472" string decimal = new org.bouncycastle.math.biginteger(hex, 16).tostring(); </code></pre><p>.net 4.0 имеет класс <a href="http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx">biginteger</a> .</p>

<p>моя версия мне кажется немного более понятной, потому что мои знания c # не так высоки. я использую этот алгоритм: <a href="http://easyguyevo.hubpages.com/hub/convert-hex-to-decimal">http://easyguyevo.hubpages.com/hub/convert-hex-to-decimal</a> (пример 2)</p><pre><code>using system; using system.collections.generic; static class tool { public static string dectohex(int x) { string result = ""; while (x != 0) { if ((x % 16) < 10) result = x % 16 + result; else { string temp = ""; switch (x % 16) { case 10: temp = "a"; break; case 11: temp = "b"; break; case 12: temp = "c"; break; case 13: temp = "d"; break; case 14: temp = "e"; break; case 15: temp = "f"; break; } result = temp + result; } x /= 16; } return result; } public static int hextodec(string x) { int result = 0; int count = x.length - 1; for (int i = 0; i < x.length; i++) { int temp = 0; switch (x[i]) { case 'a': temp = 10; break; case 'b': temp = 11; break; case 'c': temp = 12; break; case 'd': temp = 13; break; case 'e': temp = 14; break; case 'f': temp = 15; break; default: temp = -48 + (int)x[i]; break; // -48 because of ascii } result += temp * (int)(math.pow(16, count)); count--; } return result; } } class program { static void main(string[] args) { console.write("enter decimal value: "); int decnum = int.parse(console.readline()); console.writeline("dec {0} is hex {1}", decnum, tool.dectohex(decnum)); console.write("\nenter hexadecimal value: "); string hexnum = console.readline().toupper(); console.writeline("hex {0} is dec {1}", hexnum, tool.hextodec(hexnum)); console.readkey(); } } </code></pre>

<pre><code>class hextodecimal { static void main() { while (true) { console.write("enter digit number to convert: "); int n = int.parse(console.readline()); // set hexadecimal digit number console.write("enter hexadecimal number: "); string str = console.readline(); str.reverse(); char[] ch = str.tochararray(); int[] intarray = new int[n]; decimal decimalval = 0; for (int i = ch.length - 1; i >= 0; i--) { if (ch[i] == '0') intarray[i] = 0; if (ch[i] == '1') intarray[i] = 1; if (ch[i] == '2') intarray[i] = 2; if (ch[i] == '3') intarray[i] = 3; if (ch[i] == '4') intarray[i] = 4; if (ch[i] == '5') intarray[i] = 5; if (ch[i] == '6') intarray[i] = 6; if (ch[i] == '7') intarray[i] = 7; if (ch[i] == '8') intarray[i] = 8; if (ch[i] == '9') intarray[i] = 9; if (ch[i] == 'a') intarray[i] = 10; if (ch[i] == 'b') intarray[i] = 11; if (ch[i] == 'c') intarray[i] = 12; if (ch[i] == 'd') intarray[i] = 13; if (ch[i] == 'e') intarray[i] = 14; if (ch[i] == 'f') intarray[i] = 15; decimalval += intarray[i] * (decimal)math.pow(16, ch.length - 1 - i); } console.writeline(decimalval); } } } </code></pre>

<p>мое решение немного похоже на основы, но оно работает без использования встроенных функций для преобразования между системами счисления.</p><pre><code> public static string dectohex(long a) { int n = 1; long b = a; while (b > 15) { b /= 16; n++; } string[] t = new string[n]; int i = 0, j = n - 1; do { if (a % 16 == 10) t[i] = "a"; else if (a % 16 == 11) t[i] = "b"; else if (a % 16 == 12) t[i] = "c"; else if (a % 16 == 13) t[i] = "d"; else if (a % 16 == 14) t[i] = "e"; else if (a % 16 == 15) t[i] = "f"; else t[i] = (a % 16).tostring(); a /= 16; i++; } while ((a * 16) > 15); string[] r = new string[n]; for (i = 0; i < n; i++) { r[i] = t[j]; j--; } string res = string.concat(r); return res; } </code></pre>