Convertendo valores em bytes maiores que 1YB[DUVIDA]

1. Convertendo valores em bytes maiores que 1YB[DUVIDA]

Jean César
dark777

(usa Linux Mint)

Enviado em 12/06/2024 - 22:17h


E ae galera beleza?

fiz este programa em C++ para converter valores em bytes para seus respectivos tamanhos:

#include <cmath>
#include <iomanip>
#include <iostream>

/*
*
*http://extraconversion.com/pt/armazenamento-de-dados/mebibytes/mebibytes-para-gibibytes.html
*https://highscalability.com/how-big-is-a-petabyte-exabyte-zettabyte-or-a-yottabyte/
*/

void convertBytes(double bytes)
{
int const base = 1024;

std::string units[9] = {"bytes", "kilobytes", "megabytes", "gigabytes", "terabytes", "petabytes", "exabytes", "zettabytes", "yottabytes"};

int tam = (sizeof(units) / sizeof(units[0]));

std::cout << std::fixed << std::setprecision(0); // pega até o primeiro ponto.

std::cout << "Bits: " << (bytes * 8) << std::endl;

for (int i = 0; i < tam; i++)
{
std::cout << units[i] << ": " << bytes << std::endl;

bytes /= base;
}
}

void convertLLBytes(long long bytes)
{
//int const base = 1024;
long long const base = 1024LL;

std::string units[9] = {"bytes","kilobytes", "megabytes", "gigabytes", "terabytes", "petabytes", "exabytes", "zettabytes", "yottabytes"};

int tam = (sizeof(units) / sizeof(units[0]));

std::cout << std::fixed << std::setprecision(0); // pega até o primeiro ponto.

std::cout << "Bits: " << (bytes * 8) << std::endl;

for (int i = 0; i <= tam; i++)
{
std::cout << units[i] << ": " << bytes << std::endl;

bytes /= base;

if (bytes == 0) break;
}
}

int main()
{
//double bytes;

//std::cout << "Digite a quantidade de bytes: ";
//std::cin >> bytes;
//convertBytes(bytes);

//std::cout<<std::endl;

long long ytbytes = 1208925819614629174LL; //1 Yottabyte (1 YB)
convertLLBytes(ytbytes);

return 0;
}


O valor inserido corresponde a "1 yotabyte" o problema é que a função "convertLLBytes" esta convertendo até "exabytes":

Bits: -8775337516792518224
bytes: 1208925819614629174
kilobytes: 1180591620717411
megabytes: 1152921504606
gigabytes: 1125899906
terabytes: 1099511
petabytes: 1073
exabytes: 1


como corrigir isso e fazer a função percorrer o vetor corretamente?

wiki.anon


  


2. Re: Convertendo valores em bytes maiores que 1YB[DUVIDA]

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 12/06/2024 - 22:17h

Você pode corrigir isso na função convertLLBytes percorrendo o vetor de unidades de forma correta, ajustando a condição do loop e corrigindo a comparação no if. Veja o trecho corrigido da função abaixo:

```
void convertLLBytes(long long bytes)
{
long long const base = 1024LL;

std::string units[9] = {"bytes","kilobytes", "megabytes", "gigabytes", "terabytes", "petabytes", "exabytes", "zettabytes", "yottabytes"};

int tam = (sizeof(units) / sizeof(units[0]));

std::cout << std::fixed << std::setprecision(0); // pega até o primeiro ponto.

std::cout << "Bits: " << (bytes * 8) << std::endl;

for (int i = 0; i < tam; i++)
{
std::cout << units[i] << ": " << bytes << std::endl;

bytes /= base;

if (bytes == 0) {
break;
}
}
}
```

Dessa forma, a função irá percorrer corretamente o vetor de unidades e realizar a conversão de bytes para os respectivos tamanhos.


3. Re: Convertendo valores em bytes maiores que 1YB[DUVIDA]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 13/06/2024 - 10:46h

Possivelmente vc está tendo um value overflow, quando o valor do tipo ultrapassa a capacidade máxima do tipo em questão e ai vc obtém um valor não previsto, como no caso de conversão poara bits do seu programa.

Acho que no seu caso se aplica o uso de uma lib de big num, como aquela gnu gsl que tem suporte a bug num.


https://tutorialprofissa.blogspot.com/ blog com tutoriais de programação em geral
https://nerdki.blogspot.com/ acessa ai, blog dedicado Paranóia!
https://github.com/cpusam com o bug fix vem a perfeição!


4. Re: Convertendo valores em bytes maiores que 1YB[DUVIDA]

aguamole
aguamole

(usa KUbuntu)

Enviado em 13/06/2024 - 12:09h

O valor que vc esta dando é com base em 1024, então os nomes dado para os respectivos valores esta errado, corrija os nomes de acordo com a wikipedia:
https://pt.wikipedia.org/wiki/Byte

Ou troque a base.

Lembrando que eu não sei programar esta linguagem, então eu apenas li o 1024 e os respectivos nomes usados.
Veja bem, 1 kilobyte é na verdade 1000 bytes, e os outros tmb estão errados. veja na wiki.


5. Re: Convertendo valores em bytes maiores que 1YB[DUVIDA]

Jean César
dark777

(usa Linux Mint)

Enviado em 15/06/2024 - 21:51h

aguamole escreveu:

O valor que vc esta dando é com base em 1024, então os nomes dado para os respectivos valores esta errado, corrija os nomes de acordo com a wikipedia:
https://pt.wikipedia.org/wiki/Byte

Ou troque a base.

Lembrando que eu não sei programar esta linguagem, então eu apenas li o 1024 e os respectivos nomes usados.
Veja bem, 1 kilobyte é na verdade 1000 bytes, e os outros tmb estão errados. veja na wiki.


Bem lembrado mas os prefixos de unidade no vetor é o de menos, preciso ajustar a função para percorrer o vetor corretamente pois se tratando de conversao de dados a unidade é mebibyte e assim por diante..

wiki.anon






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts