我需要将两个ascii char
值转换为一个short int
。这是我的功能:
void char2short(char* pchar, short* pshort)
{
int i;
char* auxchar = pchar;
short* auxshort = pshort;
for(i = 0; i < KEYSIZE/2; i++)
{
*auxshort = (auxchar[0] << 8) | auxchar[1];
auxshort++;
auxchar += 2;
}
}
然而,当我去打印出这些值时,我常常会在开始时获得一堆FFFF。从我的终端进行了复制:
FFFFFFF7 FFFFFC24
3049 3E1B
FFFFFFE3 5705
FFFFFFBC FFFFA960
FFFFFFB1 FFFFFF84
FFFFFFEB FFFFFFAD
FFFFFFDA FFFFFFCC
FFFFFFB8 FFFFFFB0
FFFFFFC7 1125
这是我试图转换的原始数字:
static unsigned char keychar[]={
0x8C,0xF7,0xFC,0x24,0x30,0x49,0x3E,0x1B,0x6D,0xE3,0x57,0x05,
0x67,0xBC,0xA9,0x60,0x58,0xB1,0xBD,0x84,0xDD,0xEB,0xE8,0xAD,
0x69,0xDA,0x49,0xCC,0x49,0xB8,0x5D,0xB0,0x42,0xC7,0x11,0x25}
感谢您的建议。
答案 0 :(得分:1)
在算术之前,所有窄数据类型都会提升为int
。你在许多地方做错的方式。
unsigned char
,但在功能中,您将其作为char
。char
已在您的计算机上签名,因此您可以在之前没有得到负值。int
并将其存储到short
,
而不是unsigned short
。让你的类型正确,这将有效。
答案 1 :(得分:1)
代码不必要地复杂,无法正确处理签名扩展,也无法在计算中升级到int
。
推荐:
// call this function for each pair of char by:
for(int i = 0; i < sizeof(keychar); i+=2)
{
char2short( &keychar[i], &myshort );
// process myshort
}
void char2short(char* pchar, short* pshort)
{
short result = 0;
if( ('0' <= pchar[0]) && ('9' >= pchar[0]) )
{
result += pchar[0]- '0';
} // end if
if( ('0' <= pchar[1]) && ('9' >= pchar[1]) )
{
result *= 10;
result += pchar[0 - '0';
} // end if
*pshort = result;
} // end function: char2short
你的问题不明确,也许你想连续两次char
并将它们填入short
然后
void char2short(char* pchar, short* pshort)
{
char result[2] = {'0','0'};
result |= pchar[0];
result <<= 8;
result |= pchar[1];
*pshort = (short)result;
} // end function: char2short
- 甚至更简单 -
void char2short(char* pchar, short* pshort)
{
*pshort = *(short*)pchar;
} // end function: char2short
答案 2 :(得分:0)
将循环更改为
for(i = 0; i < KEYSIZE/2; i++)
auxshort[i] = (keychar[i*2] << 8) | keychar[i*2+1];
取决于编译器, char
类型是signed
或unsigned
。如果它是signed
,则0x80到0xFF之间的所有字节都被认为是负数,并且当通过默认的int促销规则转换为int
时,它们的值将是0xFFFFFF80到0xFFFFFFFF(32位int)。因此,在将它们提升为整数之前,必须将它们转换为无符号值。您的keychar
数组声明为unsigned char
,因此无需将任何内容添加到您的代码中。
在现代编译器和处理器上,指针算法通常不比数组索引快,但更难以读取,因此避免使用简单的代码。