由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - C 语言,数字变字符,有点难度
相关主题
谁帮我解释一下这个代码typedef const char *month Table[3]
question about shiftRe: 问个google面试题 (转载)
JSONCPP和ASIO能否联合使用(C++11)?hash table的size为什么最好是个质数? (转载)
C 语言,2进制转16进制,输入问题what does "a & -2" mean?
请教一个关于字符指针的简单问题Array in C
EOF一问C ++ 问题
问个字符串的基本问题这几天写了大概两万行代码
telnet的显示字符?面向对象的语言
相关话题的讨论汇总
话题: char话题: num话题: 字符话题: 532话题: 数字
进入Programming版参与讨论
1 (共1页)
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);
: 这个不是数字变字符

1 (共1页)
进入Programming版参与讨论
相关主题
面向对象的语言请教一个关于字符指针的简单问题
问个Perl的简单问题EOF一问
棘手问题:DLL和SOURCE问个字符串的基本问题
Taobao TFS 架构及开源项目telnet的显示字符?
谁帮我解释一下这个代码typedef const char *month Table[3]
question about shiftRe: 问个google面试题 (转载)
JSONCPP和ASIO能否联合使用(C++11)?hash table的size为什么最好是个质数? (转载)
C 语言,2进制转16进制,输入问题what does "a & -2" mean?
相关话题的讨论汇总
话题: char话题: num话题: 字符话题: 532话题: 数字