Char数组到无符号短转换问题

时间:2015-07-30 09:30:50

标签: c arrays casting char iar

我正在尝试将char数组转换为unsigned short但它不能正常工作。

char szASCbuf[64] = "123456789123456789123456789";

int StoreToFlash(char szASCbuf[], int StartAddress)
{   
int iCtr;
int ErrorCode = 0;
int address = StartAddress;
unsigned short *us_Buf = (unsigned short*)szASCbuf;         

// Write to flash
for(iCtr=0;iCtr<28;iCtr++)
{   
    ErrorCode = Flash_Write(address++, us_Buf[iCtr]);
    if((ErrorCode &0x45)!= 0)
    {
      Flash_ClearError();          
    }
}
return ErrorCode;
}

当我看到转化时,在us_Buf[0]上我有值12594, us_Buf[1]= 13108 like that and I have values only upto us_Buf [5]`之后,所有剩余地址都为“0”。 我试图像这样声明char数组

char szASCbuf[64] = {'1','2','3','4','5','6','7','8','9','1',.....'\0'};

我将参数传递给像这样的

StoreToFlash(szASCbuf, FlashPointer); //Flashpointe=0

我正在使用ARM的IAR嵌入式工作台。大enedian 32。 我做错了什么建议?

提前致谢。

2 个答案:

答案 0 :(得分:2)

由于对齐问题,将char数组szASCbuf重新解释为short数组并不安全。 char类型的对齐要求最低,short通常更严格。这意味着szAscBuf可能从地址13开始,而short应该从1214开始。

这也违反了严格的别名规则,因为szAscBufus_Buf指向同一位置,同时具有不同的指针类型。编译器可能会执行不考虑这一点的优化,这可能会出现一些非常讨厌的错误。

编写此代码的正确方法是以2为步长迭代原始szASCBuf,然后进行一些比特操作以产生2字节值:

for (size_t i = 0; i < sizeof(szAscbuf); i += 2) {
    uint16_t value = (szAscbuf[i] << 8) | szAscbuf[i + 1];
    ErrorCode = Flash_Write(address++, value);

    if (ErrorCode & 0x45) {
        Flash_ClearError();          
    }
}

如果您真的打算用数字值处理数字字符,可以这样做:

uint16_t value = (szAscbuf[i] - '0') + (szAscbuf[i + 1] - '0');

如果您只想要每个字符的数值为2字节值(1,2,3,4,...),则以1为步长迭代数组并以此方式获取:< / p>

uint16_t value = szAscbuf[i] - '0';

答案 1 :(得分:0)

那是正常的!

您的字符数组是"123456789123456789123456789"{'1','2','3','4','5','6','7','8','9','1',.....'\0'}

但是在ASCII '1'0x31short *,所以当您在大端架构上将数组读作{ 0x3132, 0x3334, ... } 时,它会给出:

{ 12594, 13108, ... }

在十进制中说不同:

echo "<pre>";

$myArr = array('Item', 'Repaired Wattles','Types', 'Non-Wire', 'Estimated Qty', '124', 'Actual Qty', '124', 'Upload File', 'example.jpg');
print_r($myArr);

$total = count($myArr);
$newArr = array();
for($i=0; $i<$total;$i++) {
    $newArr[$myArr[$i]] = $myArr[$i+1];
    $i++;
}

print_r($newArr);