十六进制和二进制操作
HEX and binary operations
我有问题要解决,不知道怎么做。我的程序从串行端口接收十六进制值字符串(如DFF7DF)。我需要将其转换为二进制形式,丢弃前4位,将第5位作为符号位,接下来的12位作为值。
我需要得到值作为普通INT。
我可以在MATLAB中编写这样的程序,但我需要c++才能在我的linux臂板上运行。
提前感谢您的帮助!Marcin
你可以这样做:
unsigned long value = strtoul("DFF7DF", NULL, 16);
value >>= 4; // discard first four bits
printf("Minus sign: %sn", value & 1 ? "yes" : "no");
printf("Value: %lun", (value & 0x1FFF) >> 1);
long newvalue = (value & 1 ? -1 : 1) * ((value & 0x1FFF) >> 1);
正确的答案取决于一些约定-十六进制字符串是大端序还是小端序?你是从最高位开始计数还是从最低位开始计数?是否总是正好有6个十六进制字符(24位)?
无论如何,这里有一个解决方案,始终是24位,从最高有效位开始计数。如果我的一些假设是错误的,我相信你能适应它。
int HexToInt(char *hex)
{
int result = 0;
for(;*hex;hex++)
{
result <<= 4;
if ( *hex >= '0' && *hex <= '9' )
result |= *hex-'0';
else
result |= *hex-'A';
}
return result;
}
char *data = GetDataFromSerialPortStream();
int rawValue = HexToInt(data);
int sign = rawValue & 0x10000;
int value = (sign?-1:1) * ((rawValue >> 4) & 0xFFF);
这个问题被标记为c++,但每个人都在使用C字符串。下面是如何使用c++ STL字符串
std::string s("DFF7DF");
int val;
std::istringstream iss(s);
iss >> std::setbase(16) >> val;
int result = val & 0xFFF; // take bottom 12 bits
if (val & 0x1000) // assume sign + magnitude encoding
result = - result;
从你的问题中不清楚第二个"摆弄"部分。如果你澄清了,我将更新答案
您必须检查您的机器类型的端序,但这是基本的想法。
const char * string = "DFF7DF";
const unsigned char second_nibble = hex_to_int (string[1]);
const unsigned char third_nibble = hex_to_int (string[2));
const unsigned char fourth_nibble = hex_to_int (string[2));
int sign = second_nibble & (1<<3) ? -1 : 1;
unsigned value = unsigned (second_nibble & ~(1<<3)) << 12-3; // Next three bits are in second nibble
value |= (unsigned(third_nibble)<<1) | (fourth_nibble&1); // Next 9 bits are in the next two nibbles.
确保在unsigned
类型上执行位移运算符
请遵循以下模式:
const char* s = "11";
istringstream in(string(s, 3));
unsigned i=0;
in >> hex >> i;
cout << "i=" << dec << i << endl;
相关文章:
- STL 用户定义的二进制操作
- C++二进制文件 I/O 操作速度变慢.数据库如何处理二进制文件?
- 二进制模式 + 格式化文本操作或文本模式 + 二进制数据操作 - 有意义吗?
- 二进制搜索树操作程序错误:分割故障(核心倾倒)
- 如何在我的进程中运行的二进制文件中注册操作和内核
- 为什么C++标准指定有符号整数在具有混合符号的二进制操作中强制转换为无符号整数
- 重载二进制操作的正确方法
- 无效操作数以二进制读取结构的阵列
- 了解C++位操作中的二进制转换实现
- "constexpr"通过二进制操作减少"std::array"
- 警告 639:二进制操作中类型 'uint64' 的强类型不匹配
- 二进制搜索操作
- 二进制与文本模式下的文件操作 -- 性能问题
- 如何在C++中操作和表示二进制数
- 重新创建具有最少"XOR"操作的二进制矩阵
- GDB 不会执行二进制操作
- 将操作码添加到现有二进制文件所需的内容
- 在二进制模式下使用格式化的IO操作
- 二进制搜索树c++的搜索操作总是给出0;
- 二进制比较操作的优雅方式