通用:版本号位移例程[关闭]

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连接到服务器时版本号错误

将版本号添加到 Windows 中的通用文件

错误:写入 EPROTO 4455222784:错误:1408F10B:SSL 例程:ssl3_get_record:错误的版本号:../deps/openssl/openssl/ssl/record

Java实现比较版本号

在客户端获取 iOS 通用框架的版本号

Linux内核版本号关闭自动添加后缀