1

sprintf_s関数をこの形式で C99に変換しました。確認したいだけですが、結果は同じです。

sprintf_s(char_star,"%08X",some_int);

char_star のサイズは 8 ですsome_int。8 バイトに変換されますchar_star

私がC99で修正したことは何ですか?以下の関数のいずれかを使用しましたが、これらの C99 関数と C11 Annex K の出力はsprintf_s同じではありません

char str[9];
snprintf (str, 8, "%08x", i );
//      sprintf(str, "%08x", i);
QByteArray built(str, 8);
qDebug() << built.toHex();

MFCでは、sprintfの両方でこのパケットが得られます

30 30 30 31 30 30 44 43

C99(linux glibc) sprintf(str, "%08x", i)では

30 30 30 31 30 30 64 63

問題がどこから来るか知っていますか?

ここに関数全体があります:

bool BuildAnglePacket(char* WR_PacketAZAngle, float AZAngle)
{

    WR_PacketAZAngle[0] = 0x04;
    WR_PacketAZAngle[1] = 0x30;
    WR_PacketAZAngle[2] = 0x31;
    WR_PacketAZAngle[3] = 0x02;
    WR_PacketAZAngle[4] = 0x79;
    WR_PacketAZAngle[5] = 0x4E;
    WR_PacketAZAngle[6] = 0x48;

    int  XOR;
    char HAnlge[9];
    int iAzimuthAngle;


    if (AZAngle >= -22.5 &&  AZAngle <= 22.5 )
    {

        iAzimuthAngle = AZAngle*10;

        if( AZAngle < 0)
        {

            iAzimuthAngle= abs(iAzimuthAngle);
            iAzimuthAngle=((~iAzimuthAngle)&0xFFFF) + 1 ;
        }

        iAzimuthAngle=65536 + iAzimuthAngle;

        sprintf(HAnlge,"%08x", iAzimuthAngle);

        WR_PacketAZAngle[7]  = HAnlge[0];
        WR_PacketAZAngle[8]  = HAnlge[1];
        WR_PacketAZAngle[9]  = HAnlge[2];
        WR_PacketAZAngle[10] = HAnlge[3];
        WR_PacketAZAngle[11] = HAnlge[4];
        WR_PacketAZAngle[12] = HAnlge[5];
        WR_PacketAZAngle[13] = HAnlge[6];
        WR_PacketAZAngle[14] = HAnlge[7];
        WR_PacketAZAngle[15] = 0x03;

        for(int i=4;i<16;i++)
            XOR ^= WR_PacketAZAngle[i];

        WR_PacketAZAngle[16] = XOR;
        WR_PacketAZAngle[17] ='\x0';
    }

    return true;
}
4

2 に答える 2

2

のサイズは、最後に格納するスペースが 1 つchar_star以上ある必要があります。9\0

于 2013-03-11T12:53:02.417 に答える