我正在尝试将 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
。
这也违反了严格的别名规则,因为 szAscBuf
和 us_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/