#include <string>
#include <algorithm>
#include <iostream>
template<typename T>
T binstr_to_value(const std::string &sval)
{
T v {};
size_t bitcnt = static_cast<int>(sizeof(v) * 8);
size_t strlen = sval.length();
if (strlen > 0)
{
const char *d = sval.c_str() + strlen - 1;
size_t fillcnt = std::min(bitcnt, strlen);
for (size_t i = 0; i < fillcnt; i++, d--)
{
T mask = (1 << i);
if (*d == '1')
v |= mask;
}
}
return v;
}
template<>
float binstr_to_value(const std::string &sval)
{
return 0.0f;
}
template<>
double binstr_to_value(const std::string &sval)
{
return 0.0;
}
int main()
{
char v1 = binstr_to_value<char>("1111111101");
short v2 = binstr_to_value<short>("1100111100111011");
int v2 = binstr_to_value<int>("1101100011111");
float v3 = binstr_to_value<float>("1011000111001");
}
第二版
/*
** binstr_to_value
** 将二进制字符串(可包含空白字符)转换为目标类型的数值
** 当目标类型为浮点数时,返回0.0
** reverse:指示是否反转位表示
*/
template<typename T>
T binstr_to_value(std::string sval, bool reverse = false)
{
T v {};
sval.erase(
std::remove_if(sval.begin(), sval.end(), isspace),
sval.end()
);
if (reverse)
{
std::reverse(sval.begin(), sval.end());
}
size_t bitcnt = static_cast<int>(sizeof(v) * 8);
size_t strlen = sval.length();
if (strlen > 0)
{
const char *d = sval.c_str() + strlen - 1;
size_t fillcnt = std::min(bitcnt, strlen);
for (size_t i = 0; i < fillcnt; i++, d--)
{
T mask = (1 << i);
if (*d == '1')
v |= mask;
}
}
return v;
}
template<>
float binstr_to_value(std::string sval, bool)
{
return 0.0f;
}
template<>
double binstr_to_value(std::string sval, bool)
{
return 0.0;
}
int main()
{
// 二进制字符串包含空白字符
char v1 = binstr_to_value<char>("1111 111 101"); // -3
char v2 = binstr_to_value<char>("111 111 101", true); // 127
}

被折叠的 条评论
为什么被折叠?



