Android 计算带宽的公式

Android 计算带宽的公式,android,bandwidth,Android,Bandwidth,与带宽计算公式混淆。 关于带宽检测问题,我尝试如下计算带宽 long startTime = System.currentTimeMillis(); HttpResponse response = httpclient.execute(httppost); HttpEntity httpEntity = response.getEntity(); long contentLength = httpEntity.getContentLength(); long endTime = System.c

与带宽计算公式混淆。
关于带宽检测问题,我尝试如下计算带宽

long startTime = System.currentTimeMillis();
HttpResponse response = httpclient.execute(httppost);
HttpEntity httpEntity = response.getEntity();
long contentLength = httpEntity.getContentLength();
long endTime = System.currentTimeMillis();
float bandwidth = contentLength / ((endTime-startTime) / 1000); // In the refereed question it is "((endTime-startTime) * 1000)" don't know why multiplication. 
我需要的是以位为单位的当前带宽(不是字节或千字节)。我不知道使用上面的公式,如果它是计算带宽字节或位

另外,如果下载时间是0秒,那么带宽应该是多少,即下载内容的长度。 有人能提出正确的计算带宽的公式吗

您可以从服务器下载已知大小的文件

并通过此代码直接获得wifi速度

根据你的评论,你给出了它的
//带宽:大小(KB)/时间(s)
,所以只需将它乘以
1024
就可以得到
字节
,或者
1024*8
就可以得到
,如果下载时间是0,那么从技术上讲就没有下载任何东西,因为速度是
amout/time

1.对于以位计算,只需使用

float bandwidth = contentLength / ((endTime-startTime) *(1000*1024*8));
2.如果加载时间为0,则未下载任何内容,因此我们无法建议使用bandwith

编辑2

计算

这只是简单的数学

如果每秒有kb,如
1KB/每秒

所以速度是
1kbps
=>
1*(1024字节)/1*(100000000纳秒)

因此它的
0.000001024
字节/纳米级

现在单位为
1*(1024*8位)/1*(100000000纳秒)

因此它的
0.000008192
位/纳秒

现在,如果您想在seoncds中使用它,只需将它乘以
100000000

所以它的
0.000008192*100000000=8192位/秒


(0.000008192/8)*100000000=1024字节每秒
1kbps
首先,为了精确起见,您应该使用
1000.0
转换为秒,因为您正在将带宽分配给
浮点
变量:

float bandwidth = (contentLength / (endTime-startTime)) / 1000.0;
现在,因为contentLength是以字节为单位测量的,所以需要将其转换为位(Kb、Mb等)。每个字节有8位,因此
contentLength*8
将字节转换为位

千->兆->千兆->。。。位单位的比例转换顺序为
1000
,这意味着将位转换为兆位需要除以
1000*1000
。所有这些加在一起应该产生:

int bits = contentLength * 8;
int megabits = contentLength / (1000*1000); //Megabits
float seconds = endTime-startTime / 1000.0;
float bandwidth = (megabits / seconds);  //Megabits-per-second (Mbps)
编辑#1:如果带宽以字节/时间(例如KB/s)表示,则比例转换的顺序为
1024

int bytes = contentLength;
int kilobytes = contentLength / 1024; //Kilobytes

编辑#2:当谈到带宽时,“兆”和“千”等的定义可能有些模糊,我意识到这一点。通常情况下,
1024
(210)和
1000
(103)可以互换使用(最有可能发生事故)。在许多情况下,
1024
在计算带宽时可能被视为一个数量级,因为计算机上的内存存储空间是在基数2中测量的。然而,网络带宽通常由调节比特传输的CPU的时钟速度控制,该速率以赫兹(准确地说是MHz)为单位测量,其量级为
1000
,而不是
1024
。然而,在大多数情况下,这两个数字足够接近,不会产生重大错误。

这是在这个问题中发布的……好吧,那么为什么
((endTime startTime)*1000)
如果我们需要除以秒。如果下载时间是0秒,这意味着下载所花费的时间也是以毫秒为单位的,根据您的计算如果contentLength是51200(50KB),那么我得到的带宽是0。您使用的代码是code
System.currentTimeMillis()
。因此,答案是差异
(endTime startTime)
仅以毫秒为单位是正确的??。如果您的gettimg time为0,那么您是否检查了日志,是否记录了
startTime
endTime
或是否有0个值??是否记录了开始时间和结束时间,并且我的http请求下载时间不到0秒。因此,使用您的公式,我得到的带宽值为0,内容长度为51200字节。您是否尝试使用nanoTime而不是毫秒
long startTime=System.nanoTime()
long endTime=System.nanoTime()-startTime我面临的实际问题是,我想要的是以位为单位的带宽,而不是以字节/MB/KB为单位的带宽。我可以用nano/mills/seconds来计算系统时间,但我一直在用位来计算带宽,但我希望它是位,而不是字节或KB。所以
浮动带宽
是否以位为单位?
带宽
的测量单位取决于您使用的转换。由于
getContentLength()
返回以字节为单位的量,因此必须通过乘以8转换为位。我必须将计算的带宽与一些计算的位进行比较,以检查它是否在该范围内,因此我希望带宽以位为单位。是
getContentLength
返回字节数,但我可以将带宽计算转换为位吗?
public static String internetSpeed(long msecs, long bytes)
{
    long  secs  = msecs / 1000;                                     
    long  bits  = bytes * 8;
    float speed = bits / secs;

    long  Kbit  = 1024;
    long  Mbit  = Kbit * 1024;
    long  Gbit  = Mbit * 1024;

    if (speed < Kbit )                  return String.valueOf(speed)        + " bit-sec" ;
    if (speed > Kbit && speed < Mbit)   return String.valueOf(speed / Kbit) + " Kbit-sec";
    if (speed > Mbit && speed < Gbit)   return String.valueOf(speed / Mbit) + " Mbit-sec";
    if (speed > Gbit)                   return String.valueOf(speed / Gbit) + " Gbit-sec";
    return "???";
}
int bytes = contentLength;
int kilobytes = contentLength / 1024; //Kilobytes
public static String internetSpeed(long msecs, long bytes)
{
    long  secs  = msecs / 1000;                                     
    long  bits  = bytes * 8;
    float speed = bits / secs;

    long  Kbit  = 1024;
    long  Mbit  = Kbit * 1024;
    long  Gbit  = Mbit * 1024;

    if (speed < Kbit )                  return String.valueOf(speed)        + " bit-sec" ;
    if (speed > Kbit && speed < Mbit)   return String.valueOf(speed / Kbit) + " Kbit-sec";
    if (speed > Mbit && speed < Gbit)   return String.valueOf(speed / Mbit) + " Mbit-sec";
    if (speed > Gbit)                   return String.valueOf(speed / Gbit) + " Gbit-sec";
    return "???";
}
....
System.out.println(internetSpeed((endTime-startTime), contentLength));
....