通用:版本号位移例程[关闭]
Posted
技术标签:
【中文标题】通用:版本号位移例程[关闭]【英文标题】:Generic: Version number bit shift routine [closed] 【发布时间】:2011-09-10 19:05:06 【问题描述】:我想要社区可以设计的最好的例程,它只使用 32 位提供版本号字符串。版本号将包含三个部分:主要、次要和内部版本号。包含 Java 源代码的答案的奖励业力点数。
更新 1
好的,所以为了消除一些混淆,主要和次要字段应该分别用一个 8 位字节表示,并且内部版本号将使用剩余的位。 主要:8位 次要:8位 构建:16 位 字节顺序将是小端。
这些标签表示 java 和/或 c++ 中的答案将优于 python、ruby 等。
更新 2
示例:取一个整数(4 字节),如 101020,并通过算法例程运行它以生成如下输出字符串:0.1.2
Java 解决方案
public static final int versionToInt(int major, int minor, int build)
int ver = (major << 24) | (minor << 16) | build;
return ver;
public static final String versionToString(int ver)
return String.format("%s.%s.%s", ((ver & 0xff000000) >> 24), ((ver & 0x00ff0000) >> 16), (ver & 0x0000ffff));
【问题讨论】:
为什么你也把它标记为 C++?struct unsigned char major, minor; unsigned short build; ;
?
这不是一个明确的问题。每个字段有多少位?
堆栈上有类似的答案吗?我看了看,我不记得 7 年前我们在源代码中使用的例程。我的问题不仅是为了帮助我,也是为了帮助其他人。
看看这里:download.oracle.com/javase/1.4.2/docs/api/java/util/BitSet.html
【参考方案1】:
Java:
class Version
public char major;
public char minor;
public short build;
// And the rest of your class definition ...
编辑:所以你想用位移来完成它并将它存储在一个 32 位整数中(即使使用类或结构仍会使用相同数量的存储空间)?
C 中的一个示例函数如下所示
uint32_t MakeVersionNumber( int8_t major, int8_t minor, int16_t build )
return ((uint32_t)major << 24) | ((uint32_t)minor << 16) | ((uint32_t)build);
编辑 2:
Riiight 我想我明白了。你有一个 32 位的数字,你想得到一个字符串。所以这里有一个 C++ 的例子:
std::string MakeVersionString( unsigned int ver )
std::stringstream ss;
ss << ((ver & 0xff000000) >> 24) << "." << ((ver & 0x00ff0000) >> 16) << "." << (ver & 0x0000ffff);
return ss.str();
【讨论】:
位移在哪里?在这个例子中,10201 怎么会变成 0.1.2? @Mondain:你从哪里得到 10201 的号码?让major
为零,minor
为一,build
为二。
给出的 int 是一个例子,因为我不是移位例程方面的专家。感谢您提供更新的答案。
@Mondain:还要注意在 C++ 和 Java 中,位移是以 2 为底,而不是以 10 为底。所以“0.1.2”将是 0*2^24+1*2^16+ 2 = 65538 作为整数,100.200.123 将是 100*2^24+200*2^16+123 = 1690828923 作为整数。节省空间。以上是关于通用:版本号位移例程[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
C中的OpenSSL-例程:ssl3_get_record:尝试使用TLS1_2连接到服务器时版本号错误
错误:写入 EPROTO 4455222784:错误:1408F10B:SSL 例程:ssl3_get_record:错误的版本号:../deps/openssl/openssl/ssl/record