0

我将函数参数设为 char*,在我的情况下,我得到的 XOR 等于 210。另一方面,在另一个 VS 中,我采用的第一个参数不是 char*,而是简单的 char[],XOR 是 114,即正确的。

怎么了?为什么我不能在这里得到同样的东西?

感谢您的回复。

更新:你是对的。sprintf() 工作正常。问题是其余的代码。

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;

//    AZAngle = 22;

    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;
}

已解决:是的,我忘记初始化 XOR。

4

3 回答 3

5

您的问题不在于sprintf_sor sprintf。值 65536 + 150 => 65686 => 0x10096。

这是您的代码打印的正确结果,其他任何内容都是错误。顺便说一句,我认为您的意思是 150,而不是 15,因为 0x96 => 150。

会不会是你的 Windows 版本中的 iAngle 是无符号短的,所以它会环绕而你实际上得到 150 而不是 65536+150?这可以解释“00000096”的输出,但这意味着它是原始计算代码中的一个错误,而不是打印本身。

顺便说一句,我假设真正的代码没有,char HAngle;但是char HAngle[..];如果编译器由于某种原因睡着了并且不会产生错误,那么任何事情都可能发生。

编辑:更新后的代码显示XOR未初始化,并且在用于计算之前可以包含任何内容,因此您可以获得任何结果。您必须先将其设置为 0。在 Windows 方面,如果您正在测试将整数变量设置为 0 或纯属偶然的调试版本,它可能会起作用。

于 2013-05-29T11:49:09.813 回答
2
int iAngle = 15; // for example
char HAngle;

iAngle = 65536 + iAngle;

所以iAngle== 65536 + 15==65551十六进制是0x0001000F. 如果您将其打印到字符串中,您不应该得到以下内容吗?

[0]    48 '0'
[1]    48 '0'
[2]    48 '0'
[3]    49 '1'
[4]    48 '0'
[5]    48 '0'
[6]    48 '0'
[7]    70 'F'
[8]    0 '\0'

在这种情况下,索引肯定3必须始终是十六进制吗?1

看起来windows功能正在做一些奇怪的事情......

如果您要打印到它,也HAngle应该是一个数组,否则您将溢出分配给它的存储空间。您似乎可以在调用时将其视为指针,sprintf所以我假设您的意思是char *HAngle在打印到缓冲区之前已经为缓冲区分配了内存?

编辑:从您更新的代码看来,XOR它没有初始化?如果不是,那么它可以从任何随机值开始(恐怕编译器不必将其设置为零:))。这可以解释不同的结果。在两侧它可以有一个任意的初始值,而在一侧恰好有一个零初始值......

于 2013-05-29T11:48:56.303 回答
2

最初的问题没有多大意义:除非您更改HAngle为数组(或指向数组的指针),否则代码将无法编译;十六进制 96 是十进制 150,而不是 15;你会得到额外的1,因为你将 65536(十六进制 10000)添加到值中。

在更新的问题中,由于您从未对其进行初始化,因此您获得了一个不确定的值XOR(以及技术上未定义的行为)。你要:

int XOR = 0;
        ^^^
于 2013-05-29T12:07:45.433 回答