c 弦线变成不同类型的变量
c++ stringstream into variables of different types
我得到了一个包含原始二进制数据的字符串,该数据需要转换为整数。问题是这些值并不总是相同的顺序,并且并不总是出现。因此,二进制数据的格式在配置文件中描述,并且从二进制数据中读取的值的类型是在编译时已知的。
我正在考虑类似的解决方案:
enum BinaryType {
TYPE_UINT16,
TYPE_UNIT32,
TYPE_INT32
};
long convert(BinaryType t, std::stringstream ss) {
long return_value;
switch(t) {
case TYPE_UINT16:
unsigned short us_value;
ss.read(&us_value, sizeof(unsigned short));
return_value = short;
break;
case TYPE_UINT32:
unsigned int ui_value;
ss.read(&ui_value, sizeof(unsigned int));
return_value = ui_value;
break;
case TYPE_INT32:
signed int si_value;
ss.read(&si_value, sizeof(signed int));
return_value = si_value;
break;
}
return return_value;
}
目标是以十进制输出这些值。
我的问题是:
- 此代码非常重复。有更简单的解决方案吗?(模板?)
- 如果值需要32位,我应该使用
signed int
之类的标准类型吗?用什么?endianness?
一个简单的解决方案:定义转换器的基类:
class Converter {
public:
virtual int_64 convert(std::stringstream& ss) = 0;
}
接下来为每种二进制类型定义一个混凝土转换器。从二进制类型标识符到转换器的地图/数组映射,例如:
Converter* converters[MAX_BINARY_TYPES];
converters[TYPE_UINT16] = new ConverterUINT16;
...
现在,您可以像这样使用(如函数转换中定义的变量):
:cout << converters[t]->convert(ss)
对于可移植性,而不是基本类型,例如int,long等,您应该使用int32_t,int64_t,保证在所有系统上都相同。
当然,如果您的代码旨在处理不同的末日性,则需要明确处理它。对于上面的示例代码,您可以拥有两个不同的转换器的集合,一个用于小Endian数据解码,另一个用于Big Endian。您可以做的另一件事是为std :: stringstream编写包装类课程,我们称其为stringstream,它为读取int32,uint32等定义函数,并互换字节,如果endianness与系统的体系结构不同,则代码正在运行。您可以将课程作为模板并与两个模板进行实例化:
class SameByteOrder {
public:
template<typename T> static void swap(T &) {}
};
class OtherByteOrder {
public:
template<typename T> static void swap(T &o)
{
char *p = reinterpret_cast<char *>(&o);
size_t size = sizeof(T);
for (size_t i=0; i < size / 2; ++i)
std::swap(p[i], p[size - i - 1]);
}
};
然后,使用弦线功能中的交换函数进行交换(或不)。
相关文章:
- 从模板创建通用打印函数,以打印基元数据类型变量的值
- 指针数据类型变量如何包含对象?
- 将 static_cast<int>(-15) 分配给静态常量字符类型变量
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- 如何为结构类型变量赋值
- 如何将字符类型变量附加到字符串中?
- 共享或私有 openmp 代码中的结构化类型变量
- 有没有办法在 c++ 中制作类型变量?
- 从其他类声明类类型变量会给出 C2143 错误(在"*"之前缺少";")
- 如何检查类中定义的枚举类型变量是否被分配给?
- 将子类实例保存在父类型变量中并通过父变量使用 Child 函数?
- 是否可以在没有结构的情况下创建新的类型变量?
- 为什么类型变量;不调用默认 CTR
- 如何使用CIN将输入整数值获取到char类型变量中
- 如何为 char** 类型变量提供适当的值,以便将其分配给字符串变量
- 在C++标准中哪里说必须初始化 const 内置类型变量的定义
- 为什么可以将其他类型变量用作C 中常量参考参数参数的参数
- Eclipse CDT 打开声明的自动类型变量
- 如何计算长长类型变量中的位数
- 将自动类型变量初始化为零.这种类型安全吗?