Как преобразовать десятичное в шестнадцатеричное в JavaScript

tl; dr: Да вы должны , а с OpenPojo тривиально.

  1. Вы должны сделайте некоторую проверку в своих геттерах и сеттерах, чтобы вы их тестировали. Например, setMom(Person p) не должен позволять устанавливать кого-либо моложе себя, как свою мать.
  2. Даже если вы сейчас ничего не делаете, вероятность того, что вы будете в будущем, тогда это будет полезно для регрессионного анализа. Если вы хотите разрешить настройкам матерей null, у вас должен быть тест для этого, если кто-то изменит это позже, это усилит ваши предположения.
  3. Общей ошибкой является void setFoo( Object foo ){ foo = foo; }, где она должна быть void setFoo( Object foo ){ this.foo = foo; }. (В первом случае foo, который записывается в параметр , а не поле foo объекта].
  4. Если вы возвращаете массив или коллекцию вы должны проверить, будет ли геттер собирать защитные копии данных, переданных в сеттер, перед возвратом.
  5. В противном случае, если у вас есть самые основные сеттеры / геттеры, а затем тестирование модулей, добавит, может быть, около 10 минут максимум для каждого объекта, так что же такое потеря? Если вы добавите поведение, у вас уже есть скелетный тест, и вы получите это регрессионное тестирование бесплатно. Если вы используете Java, у вас нет оправдания, так как есть OpenPojo . Существует уже существующий набор правил, которые вы можете включить, а затем просканировать весь свой проект с ними, чтобы убедиться, что они последовательно применяются в вашем коде.

Из своих примеров :

final PojoValidator pojoValidator = new PojoValidator();

//create rules
pojoValidator.addRule( new NoPublicFieldsRule  () );
pojoValidator.addRule( new NoPrimitivesRule    () );
pojoValidator.addRule( new GetterMustExistRule () );
pojoValidator.addRule( new SetterMustExistRule () );

//create testers
pojoValidator.addTester( new DefaultValuesNullTester () );
pojoValidator.addTester( new SetterTester            () );
pojoValidator.addTester( new GetterTester            () );

//test all the classes
for(  PojoClass  pojoClass :  PojoClassFactory.getPojoClasses( "net.initech.app", new FilterPackageInfo() )  )
    pojoValidator.runValidation( pojoClass );

1339
задан Peter Mortensen 12 April 2019 в 12:23
поделиться

7 ответов

Преобразуйте число в шестнадцатеричную строку с:

hexString = yourNumber.toString(16);

И реверс процесс с:

yourNumber = parseInt(hexString, 16);
2259
ответ дан Peter Mortensen 12 April 2019 в 12:23
поделиться

Код ниже преобразует десятичное значение d в шестнадцатеричный. Это также позволяет Вам добавлять дополнение к шестнадцатеричному результату. Так 0 станет 00 по умолчанию.

function decimalToHex(d, padding) {
    var hex = Number(d).toString(16);
    padding = typeof (padding) === "undefined" || padding === null ? padding = 2 : padding;

    while (hex.length < padding) {
        hex = "0" + hex;
    }

    return hex;
}
74
ответ дан Peter Mortensen 12 April 2019 в 12:23
поделиться
var number = 3200;
var hexString = number.toString(16);

Эти 16 являются основанием и существует 16 значений в шестнадцатеричном числе:-)

10
ответ дан Peter Hansen 12 April 2019 в 12:23
поделиться

Если необходимо обработать вещи как битовые поля или 32-разрядные цвета, то необходимо иметь дело с числами со знаком. Функция JavaScript toString(16) возвратит отрицательное шестнадцатеричное число, которое обычно является не, что Вы хотите. Эта функция делает некоторое сумасшедшее дополнение для создания этого положительным числом.

function decimalToHexString(number)
{
  if (number < 0)
  {
    number = 0xFFFFFFFF + number + 1;
  }

  return number.toString(16).toUpperCase();
}

console.log(decimalToHexString(27));
console.log(decimalToHexString(48.6));
135
ответ дан 19 December 2019 в 20:15
поделиться

Это основано на решениях Prestaul и Tod. Однако это - обобщение, которое составляет переменный размер переменной (например, Парсинг значения со знаком от микроконтроллера последовательный журнал).

function decimalToPaddedHexString(number, bitsize)
{ 
  let byteCount = Math.ceil(bitsize/8);
  let maxBinValue = Math.pow(2, bitsize)-1;

  /* In node.js this function fails for bitsize above 32bits */
  if (bitsize > 32)
    throw "number above maximum value";

  /* Conversion to unsigned form based on  */
  if (number < 0)
    number = maxBinValue + number + 1;

  return "0x"+(number >>> 0).toString(16).toUpperCase().padStart(byteCount*2, '0');
}

Сценарий тестирования:

for (let n = 0 ; n < 64 ; n++ ) { 
     let s=decimalToPaddedHexString(-1, n); 
     console.log(`decimalToPaddedHexString(-1,${(n+"").padStart(2)}) = ${s.padStart(10)} = ${("0b"+parseInt(s).toString(2)).padStart(34)}`);
   }

Результаты испытаний:

decimalToPaddedHexString(-1, 0) =        0x0 =                                0b0
decimalToPaddedHexString(-1, 1) =       0x01 =                                0b1
decimalToPaddedHexString(-1, 2) =       0x03 =                               0b11
decimalToPaddedHexString(-1, 3) =       0x07 =                              0b111
decimalToPaddedHexString(-1, 4) =       0x0F =                             0b1111
decimalToPaddedHexString(-1, 5) =       0x1F =                            0b11111
decimalToPaddedHexString(-1, 6) =       0x3F =                           0b111111
decimalToPaddedHexString(-1, 7) =       0x7F =                          0b1111111
decimalToPaddedHexString(-1, 8) =       0xFF =                         0b11111111
decimalToPaddedHexString(-1, 9) =     0x01FF =                        0b111111111
decimalToPaddedHexString(-1,10) =     0x03FF =                       0b1111111111
decimalToPaddedHexString(-1,11) =     0x07FF =                      0b11111111111
decimalToPaddedHexString(-1,12) =     0x0FFF =                     0b111111111111
decimalToPaddedHexString(-1,13) =     0x1FFF =                    0b1111111111111
decimalToPaddedHexString(-1,14) =     0x3FFF =                   0b11111111111111
decimalToPaddedHexString(-1,15) =     0x7FFF =                  0b111111111111111
decimalToPaddedHexString(-1,16) =     0xFFFF =                 0b1111111111111111
decimalToPaddedHexString(-1,17) =   0x01FFFF =                0b11111111111111111
decimalToPaddedHexString(-1,18) =   0x03FFFF =               0b111111111111111111
decimalToPaddedHexString(-1,19) =   0x07FFFF =              0b1111111111111111111
decimalToPaddedHexString(-1,20) =   0x0FFFFF =             0b11111111111111111111
decimalToPaddedHexString(-1,21) =   0x1FFFFF =            0b111111111111111111111
decimalToPaddedHexString(-1,22) =   0x3FFFFF =           0b1111111111111111111111
decimalToPaddedHexString(-1,23) =   0x7FFFFF =          0b11111111111111111111111
decimalToPaddedHexString(-1,24) =   0xFFFFFF =         0b111111111111111111111111
decimalToPaddedHexString(-1,25) = 0x01FFFFFF =        0b1111111111111111111111111
decimalToPaddedHexString(-1,26) = 0x03FFFFFF =       0b11111111111111111111111111
decimalToPaddedHexString(-1,27) = 0x07FFFFFF =      0b111111111111111111111111111
decimalToPaddedHexString(-1,28) = 0x0FFFFFFF =     0b1111111111111111111111111111
decimalToPaddedHexString(-1,29) = 0x1FFFFFFF =    0b11111111111111111111111111111
decimalToPaddedHexString(-1,30) = 0x3FFFFFFF =   0b111111111111111111111111111111
decimalToPaddedHexString(-1,31) = 0x7FFFFFFF =  0b1111111111111111111111111111111
decimalToPaddedHexString(-1,32) = 0xFFFFFFFF = 0b11111111111111111111111111111111
Thrown: 'number above maximum value'

Примечание: Не слишком уверенный, почему это перестало работать выше 32 bitsize

0
ответ дан 19 December 2019 в 20:15
поделиться
function dec2hex(i)
{
  var result = "0000";
  if      (i >= 0    && i <= 15)    { result = "000" + i.toString(16); }
  else if (i >= 16   && i <= 255)   { result = "00"  + i.toString(16); }
  else if (i >= 256  && i <= 4095)  { result = "0"   + i.toString(16); }
  else if (i >= 4096 && i <= 65535) { result =         i.toString(16); }
  return result
}
8
ответ дан 19 December 2019 в 20:15
поделиться

AFAIK комментарий 57807 неверен и должен выглядеть примерно так: var hex = Number (d) .toString (16); вместо того var hex = parseInt (d, 16);

function decimalToHex(d, padding) {
    var hex = Number(d).toString(16);
    padding = typeof (padding) === "undefined" || padding === null ? padding = 2 : padding;

    while (hex.length < padding) {
        hex = "0" + hex;
    }

    return hex;
}
6
ответ дан 19 December 2019 в 20:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: