我正在尝试将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。 我做错了什么建议?
提前致谢。
答案 0 :(得分:2)
由于对齐问题,将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为步长迭代数组并以此方式获取:< / p>
uint16_t value = szAscbuf[i] - '0';
答案 1 :(得分:0)
那是正常的!
您的字符数组是"123456789123456789123456789"
或{'1','2','3','4','5','6','7','8','9','1',.....'\0'}
但是在ASCII '1'
中0x31
是short *
,所以当您在大端架构上将数组读作{ 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);