C++ C11附件K和x27的转换;s sprintf_s至C99 snprintf

C++ C11附件K和x27的转换;s sprintf_s至C99 snprintf,c++,visual-c++,C++,Visual C++,我将sprintf_s函数转换为这种格式的C99。只是想确定一下,结果是一样的: sprintf_s(char_star,"%08X",some_int); char_星的大小是8。它将一些int转换为8字节的字符星 那么我在C99中所做的是正确的吗?我使用了以下函数之一,尽管这些C99函数和C11附录Ksprintf_s的输出不同 char str[9]; snprintf (str, 8, "%08x", i ); // sprintf(str, "%08x", i); QByt

我将
sprintf_s
函数转换为这种格式的C99。只是想确定一下,结果是一样的:

sprintf_s(char_star,"%08X",some_int);
char_星的大小是8。它将
一些int
转换为8字节的
字符星

那么我在C99中所做的是正确的吗?我使用了以下函数之一,尽管这些C99函数和C11附录K
sprintf_s
的输出不同

char str[9];
snprintf (str, 8, "%08x", i );
//      sprintf(str, "%08x", i);
QByteArray built(str, 8);
qDebug() << built.toHex();
在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;
}
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];
内角;

如果(AZAngle>=-22.5&&AZAngle字符星的大小应至少为
9
,以便有一个空间来存储最后一个
\0
使用

sprintf_s(char_star,“%08x”,一些int)


为了得到相同的结果。格式选项x和x是不同的!

顺便说一句,请不要将其称为“linux snprintf”。
snprintf
是C99,并且是标准的。除非你知道自己在做什么,否则不要使用sprintf或sprintf。为了安全起见,“n”版本在那里。我无法使用snprintf和sprintf获得预期的sprintf结果。请澄清为什么我没有得到相同的结果请帮助我解决这个问题不清楚什么调用会给你什么结果,但看起来你在一种情况下使用“X”,在另一种情况下使用“X”。这可以解释两种结果之间的差异。
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;
}