C++ 使用C+将ASCII转换为无符号整数形式的十六进制+;

C++ 使用C+将ASCII转换为无符号整数形式的十六进制+;,c++,ascii,C++,Ascii,首先,我想说的是,这个问题已经与这个链接()相关,但由于我无法添加评论,我需要问一些与该线程的答案相关的具体问题 Jerry Coffin的代码对我有用: for (int i=0; i<your_string.size(); i++) std::cout << std::hex << (unsigned int)your_string[i] << " "; for(int i=0;i实用程序函数已经存在,我相信您可以使用与上面实际模拟的语法类

首先,我想说的是,这个问题已经与这个链接()相关,但由于我无法添加评论,我需要问一些与该线程的答案相关的具体问题

Jerry Coffin的代码对我有用:

for (int i=0; i<your_string.size(); i++)
    std::cout << std::hex << (unsigned int)your_string[i] << " ";

for(int i=0;i实用程序函数已经存在,我相信您可以使用与上面实际模拟的语法类似的stringstreams。即使如此,仍然有快速而肮脏的方法:

template <typename T> // Use only unsigned types or risk overflow
T ASCII2hex (std::string str)
{
    T ret = 0;
    for (int i = 0; i < sizeof(T) && i < str.size(); ++i)
        ret += str[i] << (8 * i);
    return ret;
}
template//仅使用未签名类型或风险溢出
T ASCII2hex(标准::字符串str)
{
T-ret=0;
对于(int i=0;iret+=str[i]Jerry Coffin的代码所做的是,尽管转换为
无符号int
,但通常情况下,
运算符只使用
(无符号int)sString2Convert[i]有什么问题
?基数为16有什么问题吗?请检查:可能会有帮助。看起来您正在尝试将包含十六进制数字的字符串转换回数字。如果是这种情况,您的函数就错了。在顶部ans中,返回值是
stream.str()
可能您可以将其存储在字符串对象中!您好,David,我认为这可以工作。我尝试转换的ASCII字符串限制为8位(如果可以的话,请使用ASCII字母).Hi@David Van Rijn由于ASCII文本超过8个字符,我在这个解决方案中遇到了问题。我在末尾添加了一些填充空格,但实际上我只需要前8个。这只是为了防止字母不是8个字符,例如:QLMJ2W,最后2个字符是空格。但为了确保,在我操纵的字符串流中这个值我额外加了8个空格。你可以把它们放在一个64位的整数中,它确实加快了计算速度,但是使用
char[8]
或者带有尾随零的
char[9]
更合理。如果你把它放在整数中,请使用uint64\u t。但是(我不知道你的应用程序)我将为
char[9]
编写一个小包装类,其中包含一个
操作符const char*()
和一个
操作符>(istream&,my8String&)
这样你就可以轻松地将它们从stdin或whatevever中提取出来。hi@acwaters谢谢!这个代码建议已编译…但我怎么称呼它呢?使用它时我会出现编译错误。很抱歉我的无知。我只是不明白。对!很抱歉,我应该再解释一下。我给出的示例是一个函数模板;这意味着函数可以在调用之前,可以使用额外的信息(如类型)进行参数化。基本上,您可以这样做:
char[]str=“Test”
unsigned x=ASCII2hex(str);
unsigned long y y=ASCII2hex(str);
unsigned char z=ASCII2hex(str);
您不必为每种类型编写新版本;因为它们都做相同的事情,您只需告诉它将使用哪种类型,它就可以为该类型大小提供正确的答案。但是,您也可以编写上述函数,返回您想要的任何类型。只需去掉
模板
并重新编写即可将
T
s与例如
unsigned int
等符号连接起来。
template <typename T> // Use only unsigned types or risk overflow
T ASCII2hex (std::string str)
{
    T ret = 0;
    for (int i = 0; i < sizeof(T) && i < str.size(); ++i)
        ret += str[i] << (8 * i);
    return ret;
}
template <typename T> // yadda yadda unsigned
T ASCII2hex_UNSAFE_DONT_USE_THIS_FUNCTION (std::string str)
{
    return *(T*) str.data(); // Note: overrun if str.size() < sizeof(T)!!!!
}
unsigned int res=0;
res |= string[0] << 24;
res |= string[1] << 16;
res |= string[2] <<  8;
res |= string[3];