当我使用在线工具在1GB到字节之间进行转换时,我会得到不同的答案。例如,在另一个转换器中使用Google转换器:1GB=1e+9
,我得到1GB= 1073741824
。我想根据1KB=1024B
或1KB=1000B
(这是Google单位),以不同的方式使用单位。
如何使用小型C程序或功能知道我的机器使用哪个单元? C有宏吗?我想这样做,因为我的程序可能会通过各种操作系统运行。
答案 0 :(得分:14)
这两个工具正在转换两个不同的单位。
1 GB = 10^9
字节1 GiB = 2^30
个字节。
尝试使用谷歌转换器GiB
代替GB
,这个谜团将会解决。
以下内容可帮助您更好地了解转化。
Factor Name Symbol Origin Derivation Decimal
2^10 kibi Ki kilobinary: (2^10)^1 kilo: (10^3)^1
2^20 mebi Mi megabinary: (2^10)^2 mega: (10^3)^2
2^30 gibi Gi gigabinary: (2^10)^3 giga: (10^3)^3
2^40 tebi Ti terabinary: (2^10)^4 tera: (10^3)^4
2^50 pebi Pi petabinary: (2^10)^5 peta: (10^3)^5
2^60 exbi Ei exabinary: (2^10)^6 exa: (10^3)^6
请注意,二进制倍数的新前缀不是国际单位制( SI )的一部分。然而,为了便于理解和回忆,它们来自SI前缀,用于十的正幂。如表中所示,每个新前缀的名称是通过保留 SI 前缀的前两个字母并添加字母bi
来从相应SI前缀的名称派生的。 / p>
GB
和GiB
的使用仍然存在很多混淆,实际上GB
应该或者原本应该GiB
使用1 MB
。
想想硬盘世界:
您的操作系统假定1 048 576 bytes
等于1MiB
,即1 MB
。驱动器制造商认为(正确)1 000 000
等于6.4
字节。因此,如果将广告宣传为6 400 000 000 bytes
GB(6 400 000 000/1 048 576 000
),则操作系统会将其视为大约6.1 GB 6.1 GiB
=〜import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
private String hash_hmac(String str, String secret) throws Exception{
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
byte[] string = str.getBytes();
String stringInBase64 = Base64.encodeToString(string, Base64.DEFAULT);
SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
sha256_HMAC.init(secretKey);
String hash = Base64.encodeToString(sha256_HMAC.doFinal(stringInBase64.getBytes()), Base64.DEFAULT);
return hash;
}
String str = "1234";
String key = "1234";
try {
Log.d("HMAC:", hash_hmac(str,key));
} catch (Exception e) {
Log.d("HMAC:","stop");
e.printStackTrace();
}
Take a look at this for more info on prefixes for binary units 和this on metric prefixes。
答案 1 :(得分:4)
这只是单位的混乱。 G
实际上有两个前缀10⁹
,Gi
有两个前缀2³⁰
。通常应该用秒测量字节,因此正确的写作将是GiB
。
答案 2 :(得分:0)