C++ 将十六进制字符串转换为有符号整数

2023-11-24

我想在 C++ 中将十六进制字符串转换为 32 位有符号整数。

例如,我有十六进制字符串“fffefffe”。其二进制表示形式为 11111111111111101111111111111110。其有符号整数表示形式为:-65538。

我如何在 C++ 中进行这种转换?这也需要适用于非负数。例如,十六进制字符串“0000000A”,二进制为 00000000000000000000000000001010,十进制为 10。


use std::stringstream

unsigned int x;   
std::stringstream ss;
ss << std::hex << "fffefffe";
ss >> x;

下面的例子产生-65538结果是:

#include <sstream>
#include <iostream>

int main() {
    unsigned int x;   
    std::stringstream ss;
    ss << std::hex << "fffefffe";
    ss >> x;
    // output it as a signed type
    std::cout << static_cast<int>(x) << std::endl;
}

在新的 C++11 标准中,有一些新的实用函数可供您使用!具体来说,有一系列“字符串到数字”函数(http://en.cppreference.com/w/cpp/string/basic_string/stol and http://en.cppreference.com/w/cpp/string/basic_string/stoul)。这些本质上是 C 字符串到数字转换函数的薄包装,但知道如何处理std::string

因此,新代码的最简单答案可能如下所示:

std::string s = "0xfffefffe";
unsigned int x = std::stoul(s, nullptr, 16);

NOTE:以下是我的原始答案,正如编辑所说,这不是完整的答案。对于功能性解决方案,请将代码粘贴到该行上方:-)。

看来自从lexical_cast<>被定义为具有流转换语义。遗憾的是,流不理解“0x”符号。所以两者boost::lexical_cast我的手卷不能很好地处理六角弦。上面手动将输入流设置为十六进制的解决方案可以很好地处理它。

Boost 有一些东西也可以做到这一点,它也有一些很好的错误检查功能。你可以这样使用它:

try {
    unsigned int x = lexical_cast<int>("0x0badc0de");
} catch(bad_lexical_cast &) {
    // whatever you want to do...
}

如果您不想使用 boost,这里有一个轻量级的词法转换版本,它不进行错误检查:

template<typename T2, typename T1>
inline T2 lexical_cast(const T1 &in) {
    T2 out;
    std::stringstream ss;
    ss << in;
    ss >> out;
    return out;
}

你可以这样使用:

// though this needs the 0x prefix so it knows it is hex
unsigned int x = lexical_cast<unsigned int>("0xdeadbeef"); 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 将十六进制字符串转换为有符号整数 的相关文章

随机推荐

  • SMLoginItemSetEnabled 有时会默默地无法启动沙盒 UI 帮助程序

    我有一个沙盒应用程序 其中包含一个呈现一些 UI 的帮助程序 作为全屏窗口 但也可以是状态项或类似项 这在大多数情况下都有效 但有时却并非如此 它只是默默地无法启动助手 由于助手有 UI 我使用SMLoginItemSetEnabled加载
  • Google Cloud Vision API:“请求的身份验证范围不足。”

    你好 我正在尝试使用谷歌的云视觉 API 特别是这个例子 https cloud google com vision docs label tutorial label tutorial 1 我按照这个教程进行操作 https cloud
  • 在 Three.js 中创建 2 点之间的样条曲线

    我正在尝试使用 Three js 将点与样条线链接起来 以实现我想要制作的可视化效果 据我所知 我将点添加到数组中 将其传递给 THREE SplineCurve3 逐步遍历样条线点以获取几何坐标并进行渲染 如果我只将起点 终点添加到数组中
  • Html.HiddenFor 是做什么的?

    虽然我已经阅读了 Html HiddenFor 的文档 但我还没有掌握它的用途 有人可以解释它的用途并举一个简短的例子吗 这些助手应该放在代码中的哪里 它在表单上为您传递的字段 来自模型 创建隐藏输入 对于模型 视图模型中需要保留在页面上并
  • VSTS 中 Android 应用程序的 Gradle 构建在内存不足后失败

    我在 VSTS 中有一个 gradle 构建 正在构建 Android 应用程序 但它失败并出现以下错误 构建机器真的只有很少的内存吗 还是我应该更改一些设置gradle properties 例如这org gradle jvmargs设置
  • WebBrowser DocumentCompleted 事件多次触发

    我一直在研究这个东西 每个人似乎都同意解决方案是检查ReadyState直到设置为 完成 但实际上该事件有时会被触发ReadyState多次设置为 完成 我认为对于那个蹩脚的 NET WebBrowser 没有解决方案 但如果我使用底层 D
  • Java 中抛出异常

    我有一个关于在 Java 中抛出异常的问题 这似乎是我这边的一种误解 我想自己澄清一下 我一直在读到处理异常代码的两种基本方法是 1 在 try 块中使用 throw new 抛出异常 并立即在 catch 块中捕获它 所谓的 try th
  • 所有者绘制的进度条中的动画“发光”(ListView/DataGridView)

    我注意到 NET 2 0 Winforms 中的沼泽标准 ProgressBar 在 Vista 中确实显示为精美的动画发光条 但是 使用 ProgressBarRenderer 通常在尝试在所有者绘制的列表视图 网格视图或其他此类控件中绘
  • ChartJS 折线图 - 多条线,在工具提示上显示一个值

    我正在尝试制作一个图表 该图表必须显示每个客户的帐户变动 我正在尝试做什么 我有树线 第一行 最低余 额 如果客户的余额低于最低余额 余额 他的余额将从他的银行帐户自动加载 第二行 当前余额 第三行 最大余额 如果客户的余额超过最大余额 他
  • 想要使用 VBScript 运行不同文件夹中的 .bat 文件

    我正在尝试使用 VBScript 运行 bat 文件 当在与 bat 相同的文件夹中执行时 我可以让 VBScript 工作 但是 我不知道如何使其在文件夹外成功运行 Dim shell Set shell CreateObject WSc
  • Python 中 C _PyTime_t 的值

    长时间睡觉时 比如跑步time sleep 3 3 3 在 Python 3 中 程序返回 OverflowError 并显示错误消息 时间戳太大 无法转换为 C PyTime t 我最多可以睡多久 该值应为 9223372036 8547
  • 是否可以读取.net中的.eml文件

    我想知道是否可以解析 dot net 中的 eml 和 msg 文件 最好来自内存流 以便我可以在 ASP Net 页面上使用它们 EML MIME 消息 在大多数情况下 EML 是带有邮件消息的 MIME 编码文件 EML 文件的常见来源
  • 如果 web.xml 中有两个与请求匹配的 servlet 映射,会发生什么情况?

    如果 web xml 中有两个与请求匹配的 servlet 映射 会发生什么情况 它选择最具体的吗 例如 如果我有以下 xml 并且请求到达 something 而它转到 someservlet 或 everything else serv
  • 在 Android 的列表视图中滑动时显示删除按钮

    扩展另一个 Stackoverflow 问题 我实现了一些手势检测代码 以便我可以检测列表视图 位于 FrameLayout 中 中的行何时被滑动 我在这里关注了达米安关于如何从适配器获取单个行 视图的问题 答案 如何获取列表视图中行的位置
  • imaplib2 :imap.gmail.com 处理程序 BYE 响应:系统错误

    我正在更新一个 python 脚本 该脚本检查 IMAP 是否有新电子邮件 并在有新电子邮件时发送推送通知 问题是每隔几个小时我就会崩溃一次 起初我不太明白发生了什么 但后来我发现M debug 4这给了我一个很好的输出 但我仍然不明白是什
  • 用于最小化其他应用程序的批处理文件

    我怎样才能有一个打开应用程序的bat文件 让我们称之为firefox exe 我如何调用bat文件或任何其他脚本 即vbs 来最小化应用程序 即firefox exe 然后在一两分钟后关闭它 请注意start min不起作用 下面是我的脚本
  • 如何在 Vaadin 8 中添加验证器?

    在 Vaadin 7 中有一个 addValidator 函数 但在 Vaadin 8 中它不存在 Vaadin 7 示例 TextField user new TextField User user setRequired true us
  • 使用 THREE.OBJLoader 渲染 OBJ 文件

    如何使用 THREE OBJLoader 方法渲染 OBJ 文件 我有一个示例 OBJ 格式 但它不会渲染任何内容 也不会在 chrome 开发工具中看到错误 查看 OBJLoader 使用示例 https github com mrdoo
  • 在 ncurses 中实现文本滚动的推荐方法是什么?

    我正在尝试实现一个 ncurses 应用程序 其文本滚动效果如下 推荐的方法是什么 这是我所知道的 您可以使用scroll将文本缓冲区向上或向下移动 1 行 但是 如果向下滚动 您最终会在顶部出现一个空行 如果向上滚动 则会在底部出现一个空
  • C++ 将十六进制字符串转换为有符号整数

    我想在 C 中将十六进制字符串转换为 32 位有符号整数 例如 我有十六进制字符串 fffefffe 其二进制表示形式为 11111111111111101111111111111110 其有符号整数表示形式为 65538 我如何在 C 中