2011-02-10 2 views
1

У меня есть столбец в таблице объявлен как macaddr NUMBER(15) (MacAddress целого диапазона представления - до 15 цифр)Oracle11g большое целое число, чтобы преобразования шестнадцатеричной строки в PHP

РНР выборки эти значения как строки, очевидно, на 32-битной системы в dechex не справится с этим большим ints.

Как я могу легко преобразовать эти строки в шестнадцатеричное представление macaddr (человека можно использовать повторно)? И тот же вопрос в противоположном направлении?

ответ

1

вам действительно нужно хранить эту информации в цифровой форме делать? Современные компьютеры имеют достаточно места.

В любом случае вы можете использовать PHP для преобразования чисел, превышающих это.
Мое скромное решение состоит в том, чтобы не полагаться на типы, предоставляемые PHP, и использовать BCMath Arbitrary Precision Mathematics.
Согласно руководству, библиотека поставляется в комплекте с PHP начиная с версии 4.0.4. Если вы запускаете PHP в Windows, он работает прямо. В противном случае вам необходимо настроить с помощью --enable-bcmath.
Благодаря пользователю предоставлены заметки на сайте PHP.net я нашел эти две удобные функции:

<?php 

     /* hexadecimal to/from decimal functions from user contributed notes at http://it.php.net/manual/en/ref.bc.php */ 

     function bchexdec($hex) { 
      if(strlen($hex) == 1) { 
       return hexdec($hex); 
      } else { 
       $remain = substr($hex, 0, -1); 
       $last = substr($hex, -1); 
       return bcadd(bcmul(16, bchexdec($remain)), hexdec($last)); 
      } 
     } 

     function bcdechex($dec) { 
      $last = bcmod($dec, 16); 
      $remain = bcdiv(bcsub($dec, $last), 16); 

      if($remain == 0) { 
       return dechex($last); 
      } else { 
       return bcdechex($remain).dechex($last); 
      } 
     } 

    echo bcdechex (130646634308); 

    echo '<br />'; 

    echo bchexdec ('001e6b256f44'); 


    ?> 
+0

Мне нужно сохранить их как целые числа в db, потому что будет множество операций, например, получить следующий/предыдущий номер в пуле, генерируя это из шестнадцатеричного представления, будет подвержен ошибкам, а целые числа - его просто +/- операции – canni

0

Вы можете найти полезный тип float, предоставляемый PHP, который является достаточно большим для хранения ваших значений. Сначала конвертируйте в float, а затем вставьте или обновите в поле вашей базы данных. Основная проблема здесь заключается в преобразовании float в/из hexadecimals.

После некоторой работы над моей собственной попыткой написать функцию hex2dec я придумал ресурс: руководство по PHP.

Посмотрите на первый комментарий, Nstiac. Он пишет несколько функций для преобразования шестнадцатеричных строк в числа с плавающей запятой

EDIT: Предоставленные функции показали как-то сломаться (см. Комментарии ниже)! Используйте свой риск!

http://www.php.net/manual/en/language.types.float.php

+0

Не совсем верно ... Mac: '00: 1E: 6B: 25: 6F: 44' имеет int: '130646634308', функция, предоставленная в этих комментариях, создает:' float2hex32n ('130646634308') = '4effffff'' – canni

+0

Извините, я не пробовал код перед публикацией. Я отредактирую свой ответ и займусь другим решением. Еще раз извините. – Massimog

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