LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1523|回复: 6

【HELP】我也要将十进制转换成十六进制

[复制链接]
发表于 2009-7-12 16:42:12 | 显示全部楼层 |阅读模式
各位大侠,想要从一个文件里读入一些十进制数,每行有好多个数,数之间以空格分开,然后把它们转成十六进制数存到另一个文件里。数字的大小是负800到正800之间,要求负数以补码表示,转换成的十六进制数为四位而且两位两间以空格分开而且没有“0x”前缀;用bash,bc,calc,mathematica,C语言实现都可以,应该怎么写阿?
先谢谢各位了~~~
发表于 2009-7-13 13:06:44 | 显示全部楼层
追求效率的话就用 C 吧
  1. /* gcc a.c && ./a.out < input.txt > output.txt */
  2. #include <stdio.h>
  3. int main(void)
  4. {
  5.         int x;
  6.         if (scanf("%d", &x) != EOF)
  7.                 printf("%04hx", (short) x);
  8.         while (scanf("%d", &x) != EOF)
  9.                 printf(" %04hx", (short) x);
  10.         return 0;
  11. }
复制代码
一开始的 if () 那一段是针对空格的特殊处理. 如果最后一个输出的后面允许空格的话, 就可以把 if () 段整个去掉, 然后 while () 段中中的输出格式改为 "%04hx "

如果想再提高效率的话
  1. /* gcc a.c && ./a.out < input.txt > output.txt */
  2. #include <stdio.h>
  3. inline void output(short x)
  4. {
  5.         const static char tab[] = "0123456789abcdef";
  6.         putchar(tab[(x >> 12) & 0x0f]);
  7.         putchar(tab[(x >>  8) & 0x0f]);
  8.         putchar(tab[(x >>  4) & 0x0f]);
  9.         putchar(tab[(x >>  0) & 0x0f]);
  10.         putchar(' ');
  11. }
  12. int main(void)
  13. {
  14.         int x;
  15.         while (scanf("%d", &x) != EOF)
  16.                 output(x);
  17.         return 0;
  18. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-15 12:55:18 | 显示全部楼层
remote fish兄功德无量,最近有点忙,回去试试,在此谢过。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-16 20:32:00 | 显示全部楼层
还有个小问题。输入文件有换行的地方,输出文件最好也换行,要不只输出在同一行上,太长了。
回复 支持 反对

使用道具 举报

发表于 2009-7-17 13:13:29 | 显示全部楼层
这个加个计数就 OK 啊, 或者把结果再处理一下
  1. sed 's/\(.\{39\}\) /\1\n/g' < output.txt > result.txt
复制代码
其中 39 换成 (5k-1) 可以改变输出宽度.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-20 22:09:22 | 显示全部楼层
remote fish兄简直就是我的偶像,我对你的敬仰如涛涛江水绵绵不绝,如长江泛滥一发不可收。
改天我也要把Linux C和Shell学好点。
回复 支持 反对

使用道具 举报

发表于 2009-7-21 09:18:18 | 显示全部楼层
这个这个, 不必客气

咱也是受到无数人的帮助才逐渐掌握这些知识的, 孤魂兄要是想表示感谢的话, 就去尽自己所能地帮助别人吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表