C++符号扩展
C++ sign extension
我正在处理一个家庭作业问题,从二进制文件打印。我搜索了一下,发现我的问题是一个符号扩展问题。
在c中,正确的操作是强制转换为(无符号字符(
我尝试过这个解决方案,但它不适用于cout
带(无符号(的输出为:
4D 5A FFFFFF90 00 03 00 00 00 04 00 00 00 FFFFFFFF FFFFFFFF 00 00
带有(无符号字符(的输出为:
0M 0Z 0ê 0� 0 0� 0� 0� 0 0� 0� 0� 0ˇ 0ˇ 0� 0�
任何指导都将是最有帮助的;
这是代码:
void ListHex(ifstream &inFile)
{
// declare variables
char buf[NUMCHAR];
unsigned char bchar;
while(!inFile.eof())
{
inFile.read(buf,NUMCHAR);
for (int count = 0; count < inFile.gcount(); ++count)
{
cout << setfill('0') << setw(2) << uppercase << hex <<
(unsigned)buf[count] << ' ';
}
cout << 'n';
}
}
cout <<setfill('0') << setw(2) << uppercase << hex << (0xFF & buf[count])
怎么样
void ListHex(std::istream& inFile) {
// declare variables
char c;
while(inFile >> c) {
std::cout << std::setw(2) << std::hex
<< static_cast<int>(c);
}
}
我建议每个字符都这样做,原因是在处理rinterpretive int转换时,存在各种各样的endian问题,我甚至不愿考虑。std::ifstream
无论如何都会为您缓冲字符(您的操作系统也可能如此(。
请注意,我们如何将文件流作为更通用的std::istream
,这允许我们传入任何类型的istream
,包括std::istringstream
、std::cin
和std::ifstream
。
例如:
ListHex(std::cin);
std::istringstream iss("hello world!");
ListHex(iss);
将十六进制用户输入。
编辑
使用缓冲
void ListHex(std::istream& inFile) {
// declare variables
char arr[NUMCHAR];
while(inFile.read(arr, NUMCHAR)) {
for(std::size_t i=0; i!=NUMCHAR; ++i) {
std::cout << std::setw(2) << std::hex
<< static_cast<int>(arr[i]);
}
}
}
您可以通过屏蔽高位来消除符号扩展:
(((unsigned) buf[count)) & 0xff)
std::cout将无符号字符打印为字符,而不是整数。你可以在这里进行两次投射——大致如下:
static_cast <int> (static_cast <unsigned char> (buf[count]))
或者,使用无符号字符缓冲区和单强制转换:
void ListHext(ifstream& inFile)
{
unsigned char buf[NUMCHAR];
while (inFile.read(reinterpret_cast <char*> (&buf[0]), NUMCHAR))
{
for (int i=0; i < NUMCHAR; ++i)
cout << ... << static_cast <int> (buf[i]) << ' ';
cout << endl;
}
}
编辑:此处不应使用掩码,因为它假定特定的字符大小。以下仅在CHAR_BIT为8:时等效
// bad examples
x & 0xFF // note - implicit int conversion
static_cast <int> (x) & 0xFF // note - explicit int conversion
// good example
static_cast <int> (static_cast <unsigned char> (x))
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 是否可以通过C++扩展强制多个python进程共享同一内存
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 尝试使用 Cython 扩展时未定义的符号
- 符号将11位扩展到32位
- 使用范围检查和带符号的size_type扩展std::vector
- 是否删除整数的符号扩展
- Linux 如何解析用作扩展的库的未解析符号
- 加载使用 SWIG 制作的 php 扩展时未定义的符号
- Python C 扩展使用 numpy 和 gdal 在运行时给出未定义的符号
- qml扩展上的未定义符号(来自示例)
- Arduino中不需要的符号扩展
- 符号扩展对文字与变量
- 使用从结构体扩展的符号
- 扩展'isalnum'以识别 UTF-8 变音符号
- 在x64汇编文件上的符号扩展
- C++符号扩展
- 类扩展模板类的C++符号导出
- 错误的符号扩展c++/qt