3

signed int16進文字列をusingに変換するコードを見つけましたstrtolが、短いint(2バイト)のコードが見つかりません。これが私のコードです:

while (!sCurrentFile.eof() )
{
    getline (sCurrentFile,currentString);
    sOutputFile<<strtol(currentString.c_str(),NULL,16)<<endl;
}

私の考えは、2バイト幅の値(0xFFEEなど)を持つファイルを読み取り、それをsigned intに変換して、結果を出力ファイルに書き込むことです。実行速度は問題ではありません。

問題を回避する方法をいくつか見つけることができましたが、「1行」のソリューションを使用したいので、これを支援できるかもしれません:)

編集:ファイルは次のようになります:

0x0400
0x03fe
0x03fe
...

編集:私はすでに16進演算子を試しましたが、それでもそうする前に文字列を整数に変換する必要があります。

// This won't work as currentString is not an integer
myInt << std::hex << currentString.c_str(); 
4

6 に答える 6

5

これは単純なはずです:

std::ifstream   file("DataFile");
int             value;

while(file >> std::hex >> value)  // Reads a hex string and converts it to an int.
{
    std::cout << "Value: " << std::hex << value << "\n";
}

私たちがファイルについて話している間:
あなたはこれをすべきではありません

while (!sCurrentFile.eof() )
{
    getline (sCurrentFile,currentString);
    ... STUFF ...
}

これは、最後の行を読んだときにEOFが設定されていないためです。したがって、ループして最後の行の後の行を読み取ると、getline()は失敗し、最後に設定されたときからcurrentStringにあったものに対してSTUFFを実行します。したがって、実際には、最後の行を2回処理します。

ファイルをループする正しい方法は次のとおりです。

while (getline(sCurrentFile,currentString))
{
    // If the get fails then you have read past EOF and loop is not entered.
    ... STUFF ...
}
于 2009-09-28T16:39:00.723 に答える
4

おそらく、stringtreamクラスの>>演算子を16進マニピュレーターで使用できます。

于 2009-09-28T14:51:40.690 に答える
3

sscanf「%hx」変換修飾子を検討しましたか?

于 2009-09-28T14:51:06.013 に答える
1
// convert unsigned-integer to it's hexadecimal string represention
// 0x12345678 -> '12345678'
// N is BYTE/WORD/UINT/ULONGLONG
// T is char or wchar_t
template <class N, class T> inline T* UnsignedToHexStr(N    n             ,  // [i  ]
                                                       T*   pcStr         ,  // [i/o] filled with string
                                                       UINT nDigits       ,  // [i  ] number of digits in output string / 0 (auto)
                                                       bool bNullTerminate ) // [i  ] whether to add NULL termination
{
    if ((N)-1 < (N)1)              // if type of N is floating-point / signed-integer
        if (::IsDebuggerPresent())
        {
            ::OutputDebugString(_T("UnsignedToHexStr: Incorrect type passed\n"));
            ::DebugBreak();
        }

    if (!nDigits)
        nDigits= GetUnsignedHexDigits(n);

    if (1 == sizeof(T))
    {
        const char _czIntHexConv[]= "0123456789ABCDEF";
        for (int i= nDigits-1; i>= 0; i--)
        {
            char* pLoc= (char*)&pcStr[i];
            *pLoc= _czIntHexConv[n & 0x0F];
            n >>= 4;
        }
    }
    else
    {
        const wchar_t _czIntHexConv[]= L"0123456789ABCDEF";
        for (int i= nDigits-1; i>= 0; i--)
        {
            wchar_t* pLoc= (wchar_t*)&pcStr[i];
            *pLoc= _czIntHexConv[n & 0x0F];
            n >>= 4;
        }
    }

    if (bNullTerminate)
        pcStr[nDigits]= 0;

    return pcStr;
}



// --------------------------------------------------------------------------
// convert unsigned-integer in HEX string represention to it's numerical value
// '1234' -> 0x1234
// N is BYTE/WORD/UINT/ULONGLONG
// T is char or wchar_t
template <class N, class T> inline bool HexStrToUnsigned(const T* pczSrc                    ,
                                                         N&       n                         ,
                                                         bool     bSpecificTerminator= false,  // whether string should terminate with specific terminating char
                                                         T        cTerminator        = 0     ) // specific terminating char
{
    n= 0;

    if (!pczSrc)
        return false;

    while ((32 == *pczSrc) || (9 == *pczSrc))
        pczSrc++;

    bool bLeadZeros= *pczSrc == _T('0');
    while (*pczSrc == _T('0')) // skip leading zeros
        pczSrc++;

    BYTE nMaxDigits= 2*sizeof(N);
    BYTE nDigits   = 0          ;

    while (true)
    {
        if ( (*pczSrc >= _T('0')) && (*pczSrc <= _T('9')))
        { if (nDigits==nMaxDigits) return false; n= (n<<4) + (*pczSrc-_T('0')   ); pczSrc++; nDigits++; continue; }

        if ( (*pczSrc >= _T('A')) && (*pczSrc <= _T('F')))
        { if (nDigits==nMaxDigits) return false; n= (n<<4) + (*pczSrc-_T('A')+10); pczSrc++; nDigits++; continue; }

        if ( (*pczSrc >= _T('a')) && (*pczSrc <= _T('f')))
        { if (nDigits==nMaxDigits) return false; n= (n<<4) + (*pczSrc-_T('a')+10); pczSrc++; nDigits++; continue; }

        if (bSpecificTerminator)
            if (*pczSrc != cTerminator)
                return false;

        break;
    }

    return (nDigits>0) || bLeadZeros; // at least one digit
}
于 2009-09-28T16:55:42.180 に答える
-1

データが信頼できると確信している場合はcurrentString.c_str()、簡単に行うこともできます

myInt << std::hex << atoi(currentString.c_str());
于 2009-09-28T15:14:08.503 に答える
-1

データが常にその形式になることがわかっている場合は、次のようなことを行うことはできません。

myInt << std::hex << currentString.c_str() +2; // skip the leading "0x"
于 2009-09-28T15:31:55.663 に答える