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

标签 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 就像那样,我的值只有 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 嵌入式工作台。大字节 32。 对我做错的地方有什么建议吗?

提前致谢。

最佳答案

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

这也违反了严格的别名规则,因为 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 为步长迭代数组并以这种方式获取它:

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

关于字符数组到无符号短转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31720031/

相关文章:

c - 读取文件并通过不循环的套接字连接发送

c - 数组和 matlab 编码器的问题

c - 使用 malloc 作为 typedef char name[300][300]? (C)

更改 C 签名以接受字符数组而不是整数数组

c++ - 使用 static_cast 的无效类型转换,我应该使用什么正确的转换?

c - 在 64 位进程中,我的 mmap/malloc 请求会被拒绝吗?

c - 尝试生成大型数据集时出现问题

c - 内联 Hook 后 'pathname' 系统调用中 'mkdir()' 参数的内容不可读

c - malloc 之后访问结构数组的内容

将 int 转换为指针 - 为什么要先转换为 long? (如 p = (void*) 42; )