Tratamento de inteiros de 64 bits em PHP
| Tweet |
|
Enviado por Marcus Vinicius (mvleandroΘgmail·com):
Esta aplicação client-side, para controlar a versão dos arquivos que recebe, precisa ler o conteúdo de um arquivo binário, que continha um número inteiro representando a data da versão no formato: Ymdhis.
O primeiro problema surgiu devido ao tamanho do inteiro. Para gravar um inteiro deste tamanho, por exemplo: 20100831120030, eu precisaria de pelo menos 45 bits, porém o PHP, até a atual versão, só grava números inteiros de 32 bits. Acima de 32 bits somente número de ponto flutuante. Precisamos converter o inteiro para 64 bits.
O segundo problema veio ao tentar gravar um número inteiro de 64 bits em um arquivo. As funções de manipulação de arquivo do PHP só trabalham com strings e não com inteiros. Se eu usasse uma função como file_put_contents, por exemplo, ela criaria um arquivo com 64KB em vez de 64b, pois interpretaria cada bit como um caractere, usando um byte para representar cada um, em vez de um bit. O que precisamos é que o conteúdo do arquivo seja exatamente: 00100100100100000010110111001100000101010011110 em binário e não a string correspondente a este binário.”
Veja mais em -> http://www.phpnaveia.com.br/artigo/salvando-um-numero-inteiro-de-64-bits-em-um-arquivo-binario/” [referência: phpnaveia.com.br]
| Tweet |
|
• Link direto para este post: http://br-l.org/!24691
• Siga no Twitter: @brlinuxblog e @augustocc
• Mais posts do mesmo tema: Desenvolvedores











Sempre que descubro algo novo sobre PHP, me decepciono um pouco mais.
devnull Você tem o direito de se decepcionar, assim como tem o direito de permanecer na superficialidade/preconceitos sobre PHP.
A versão 6 do PHP já vai trabalhar com inteiros de 64 bits. E PHP é uma linguagem poderosíssima.
Já ouviu falar em FaceBook por exemplo? Não é feito em .Net nem em Java, nem em Python, tampouco em rails, é em PHP. É bom né? Rápido né?
Abraço!
É realmente necessário usar 64 bits? Eu usaria algum algorítimo para compactar a informação. Talvez converter a data para data Juliana. Um método fácil de entender segue abaixo.
Veja como compactar a hora:
his = precisa de 18 bits
(h*60+i)*60+s = precisa de 16 bits
Já a data, complica. Se vc limitá-la de 128 anos fica bem mais fácil, por exemplo, de 1900 a 2027, ou de 2000 a 2127. Daí:
Y-m-d 9999-12-31 = precisa de 27 bits
Y-m-d 2099-12-31 = precisa de 25 bits
Y-m-d 2127-12-31 usando ((Y-2000)*13+m)*32+d = precisa de 16 bits
Obs.: vi em alguns lugares que o cara usa na fórmula acima, o m-1 e o d-1 (para fazer o mês e o dia começarem do zero). Daí os fatores ficam *12 e *31, mas não vejo ganho de bits nisso.
É claro que é muito importante escolher a faixa, pois não poderá armazer qq data que seja fora dela.