r*****8 发帖数: 2560 | 1 C 语言,数字变字符,有点难度。
我有一串数字,532、7892、1253、、、、要变成2个字符,要求字符里面的2进制
码,相当于这些数值。也就是相当于这些整数。
以532为例,要求2个字符里面实际上是整数(int)532,只是数据类型不同.
我的愚笨想法是,10进制532相当于16进制0214,相当于2进制的0000、0010、0001
、0100,然后把这些1推到每个字符的相应位置:
char my_string[2] = ‘\0\0’;
my_string[1] <<= 2;
x |= 1;
如此循环,最终得到符合要求的字符。
各位高人指点一下,有没有别的方法?
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
如果各位想知道我的怪题目从哪儿来的,继续往下看。有一个无人值守站点,有
数据要传回来,通过铱星传输。数据的最后,要算一个checksum,占2个字符。内容是
前面的有效数据之和,用16进位表示,取最后4个。例如:16进位的0214。 |
N********n 发帖数: 8363 | 2
0001
// Let me see how much I still remember of C
short num = 532;
char* pc = &num
char my_s[2];
my_s[0] = (char *)pc;
my_s[1] = (char *)(pc + 1);
【在 r*****8 的大作中提到】 : C 语言,数字变字符,有点难度。 : 我有一串数字,532、7892、1253、、、、要变成2个字符,要求字符里面的2进制 : 码,相当于这些数值。也就是相当于这些整数。 : 以532为例,要求2个字符里面实际上是整数(int)532,只是数据类型不同. : 我的愚笨想法是,10进制532相当于16进制0214,相当于2进制的0000、0010、0001 : 、0100,然后把这些1推到每个字符的相应位置: : char my_string[2] = ‘\0\0’; : my_string[1] <<= 2; : x |= 1; : 如此循环,最终得到符合要求的字符。
|
r*****8 发帖数: 2560 | 3 谢谢!我试试好用不。
【在 N********n 的大作中提到】 : : 0001 : // Let me see how much I still remember of C : short num = 532; : char* pc = &num : char my_s[2]; : my_s[0] = (char *)pc; : my_s[1] = (char *)(pc + 1);
|
r*****8 发帖数: 2560 | 4 答案正确,不过编译的时候警告很多。
您看看能不能在给修改一下。同时给解释一下。
或者可以不用管警告?不影响程序的稳定性。
char* pc = &num;
warning: initialization from incompatible pointer type (enabled by default)
my_s[0] = (char *)pc;
warning: assignment makes integer from pointer without a cast (enabled by
default)
my_s[1] = (char *)(pc + 1);
警告同上。
【在 N********n 的大作中提到】 : : 0001 : // Let me see how much I still remember of C : short num = 532; : char* pc = &num : char my_s[2]; : my_s[0] = (char *)pc; : my_s[1] = (char *)(pc + 1);
|
N********n 发帖数: 8363 | 5 如果只是16位数字下面两行CODE就解决了,不用指针也不会有WARNING。多年
过去了一看是C就往指针上想,当年的职业病一直没治好。
my_s[0] = num % 256
my_s[1] = num / 256 |
r*****8 发帖数: 2560 | 6 思路很有智慧!
编译没有错误,结果完全正确。
你是大牛!
谢谢!
【在 N********n 的大作中提到】 : 如果只是16位数字下面两行CODE就解决了,不用指针也不会有WARNING。多年 : 过去了一看是C就往指针上想,当年的职业病一直没治好。 : my_s[0] = num % 256 : my_s[1] = num / 256
|
w*********l 发帖数: 1337 | 7 什么标准?c99就直接上uint16_t吧。省得麻烦。
0001
【在 r*****8 的大作中提到】 : C 语言,数字变字符,有点难度。 : 我有一串数字,532、7892、1253、、、、要变成2个字符,要求字符里面的2进制 : 码,相当于这些数值。也就是相当于这些整数。 : 以532为例,要求2个字符里面实际上是整数(int)532,只是数据类型不同. : 我的愚笨想法是,10进制532相当于16进制0214,相当于2进制的0000、0010、0001 : 、0100,然后把这些1推到每个字符的相应位置: : char my_string[2] = ‘\0\0’; : my_string[1] <<= 2; : x |= 1; : 如此循环,最终得到符合要求的字符。
|
w*********l 发帖数: 1337 | 8 另,即便没有c99,大部分platform上unsigned short也是16bit。为什么要存在两个
char上?
0001
【在 r*****8 的大作中提到】 : C 语言,数字变字符,有点难度。 : 我有一串数字,532、7892、1253、、、、要变成2个字符,要求字符里面的2进制 : 码,相当于这些数值。也就是相当于这些整数。 : 以532为例,要求2个字符里面实际上是整数(int)532,只是数据类型不同. : 我的愚笨想法是,10进制532相当于16进制0214,相当于2进制的0000、0010、0001 : 、0100,然后把这些1推到每个字符的相应位置: : char my_string[2] = ‘\0\0’; : my_string[1] <<= 2; : x |= 1; : 如此循环,最终得到符合要求的字符。
|
f*****n 发帖数: 405 | 9 这样不行吗?
union {
int num;
char s[2];
} data;
data.num 就是那个数字,data.s[0], data.s[1]就是那两个字符 |
q***i 发帖数: 627 | 10 sscanf可以解决几乎所有的数字
#include
int main ()
{
char sentence []="Rudolph is 12 years old";
char str [20];
int i;
sscanf (sentence,"%s %*s %d",str,&i);
printf ("%s -> %d\n",str,i);
return 0;
} |
r*****8 发帖数: 2560 | 11 手册规定要存在2个字符里。
以下是手册链接,第95页(总109页),有关SBDWB部分。
https://www.rock7mobile.com/downloads/IRDM_ISU_ATCommandReferenceMAN0009_
Rev2.0_ATCOMM_Oct2012.pdf
【在 w*********l 的大作中提到】 : 另,即便没有c99,大部分platform上unsigned short也是16bit。为什么要存在两个 : char上? : : 0001
|
c******e 发帖数: 545 | 12 除了别人的解法
1.用指针
short int num = 532;
char * c_ptr = (char*)(&num);
然后可以用c_ptr访问num的每个字节。little endian系统里,c_ptr[0]是LSB
2.逻辑运算
short int num = 532;
char LSB = (char)(num & 0xFF);
char MSB = (char)((num >> 8) & 0xFF);
这个不是数字变字符 |
r*****8 发帖数: 2560 | 13 谢谢你给出解法。
【在 c******e 的大作中提到】 : 除了别人的解法 : 1.用指针 : short int num = 532; : char * c_ptr = (char*)(&num); : 然后可以用c_ptr访问num的每个字节。little endian系统里,c_ptr[0]是LSB : 2.逻辑运算 : short int num = 532; : char LSB = (char)(num & 0xFF); : char MSB = (char)((num >> 8) & 0xFF); : 这个不是数字变字符
|
j******g 发帖数: 2689 | 14 不错,很精简。
【在 c******e 的大作中提到】 : 除了别人的解法 : 1.用指针 : short int num = 532; : char * c_ptr = (char*)(&num); : 然后可以用c_ptr访问num的每个字节。little endian系统里,c_ptr[0]是LSB : 2.逻辑运算 : short int num = 532; : char LSB = (char)(num & 0xFF); : char MSB = (char)((num >> 8) & 0xFF); : 这个不是数字变字符
|