Avatar billede Slettet bruger
10. august 2011 - 16:48 Der er 9 kommentarer og
1 løsning

Hex-numre i JS/PHP

Hejsa

Jeg skal oversætte en Javascript-funktion til PHP. Jeg er dog stødt på et problem. Javascript-funktionen bruger .toString(16) for at konvertere et tal til hex-form, hvor den tilsvarende i PHP er dechex().

Det fungerer fint med mindre tal, men når vi kommer op i store tal (som funktionen bruger), bliver resultaterne forskellige.

Nogle der kan hjælpe?

http://cl.ly/3g3i0K2K3D1X170V123u

På forhånd tak!
Avatar billede claes57 Ekspert
10. august 2011 - 16:56 #1
det ser umiddelbart ud til at dechex stopper ved 32676/65352 - men tjek lige selv. Hvis det er tilfældet må du dele med dette tal (evt i et loop), og så stykke facit samme.
Avatar billede arne_v Ekspert
10. august 2011 - 17:12 #2
http://au.php.net/manual/en/function.dechex.php siger

Description
string dechex ( int $number )

Returns a string containing a hexadecimal representation of the given number argument. The largest number that can be converted is 4294967295 in decimal resulting to "ffffffff".
Avatar billede Slettet bruger
11. august 2011 - 11:04 #3
Og det er ikke muligt at konvertere større tal end 4294967295 på nogen måde? Jeg er lidt lost på dette område, må jeg indrømme..
Avatar billede claes57 Ekspert
11. august 2011 - 11:12 #4
lav et loop
hvis tallet er større end 4294967295 så del med 4294967295
rest-delen ganges igen med 4294967295 og konverteres
det konverterede tilføjes i en tekststreng
heltals-delen køres forfra i loopet, der først stopper når heltalsdelen er 0

så vil du sidde med en tekststreng, der indeholder tallet konverteret
jeg er ikke til php, så en anden må skrive koden
Avatar billede Slettet bruger
11. august 2011 - 16:34 #5
Nu ved jeg godt du ikke er til PHP, men en kan måske spotte fejlen her:

$max = 4294967295;

function dhex($val){
global $max;
$rest = $val;
$string = "";
while (true) {
  if ($rest > $max) {
  $quotient = $rest/$max;
  $int = floor($quotient);
  $num = $quotient-$int;
  $rest += -$num;
  $string .= dechex($num);
  } else {
  $string .= dechex($rest);
  break;
  }
}
return $string;
}
Avatar billede claes57 Ekspert
11. august 2011 - 16:53 #6
while (true) {
  if ($rest > $max) {      /// hvis 10 > 4
  $quotient = $rest/$max;  /// $q = 10 / 4 = 2,5
  $int = floor($quotient);  /// $i = heltal(2,5) = 2
  $num = $quotient-$int;    /// $n = 2,5 - 2 = 0,5
  $rest += -$num;          /// $r skal være $i = 2
  $string .= dechex($num);  /// $s = tilhex(0,5) + evt tidl $s (dvs ikke sat efter, men før)
  } else {
  $string .= dechex($rest); /// $s = tilhex(rest) + evt tidl $s (dvs ikke sat efter, men før)
  break;
  }
}

jeg håber du kan følge mit taleksempel...
Avatar billede Slettet bruger
11. august 2011 - 17:59 #7
Så er vi ude i følgende: http://pastebin.com/gWZWJgx1
Det giver os værdien e40 (ved value=979797565656, som jeg tester med) hvor javascript (new Number(979797565656)).toString(16); (js-måden at gøre det på) giver e4207c60d8
Avatar billede claes57 Ekspert
11. august 2011 - 18:36 #8
jeg har lavet et lille eksempel, som kører nogle flere gange igennem (ellers kan jeg ikke lige gennemskue det ;( )
$num er rettet i loop

<?php
function dhex($val){
$max = 16;
$rest = $val;
$string = "";
while (true) {
  if ($rest > $max) {
  $quotient = $rest/$max;
  $int = floor($quotient);
  $num = ($quotient-$int)*$max;
  $rest = $int;
  $string = dechex($num) . $string;
  } else {
  $string = dechex($rest) . $string;
  break;
  }
}
return $string;
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head></head><body>
<?php
echo dhex('32768');
?>
</body></html>

979797565656 giver så e4207c60d8
så det må være det... jeg lægger svar nu
Avatar billede Slettet bruger
11. august 2011 - 22:04 #9
Works like a charm - mange tak! Det sætter jeg sku' pris på :-)
Avatar billede arne_v Ekspert
12. august 2011 - 04:25 #10
Jeg ville overveje:

sprintf('%8x', $n / 0xFFFFFFFF) . sprintf('%08x', $n)

fordi efter:

$n = 979797565656;

har $n type double og en double har kun 53 bits precision, saa der er ikke meget sjov ved at kunne haandtere uendeligt mange bits.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester