【发布时间】:2014-06-21 17:07:58
【问题描述】:
我想在没有任何预定义 C/C++ 函数(例如 itoa)的情况下将数字转换为非零终止字符数组。 我没有太多空间了(在一个总共 5KB pgm 空间的嵌入式应用程序上工作,我已经使用了 4.862KB)并且我的输出函数不接受以零结尾的字符数组;只有一个数组和长度。
编辑 1:我不是为公司工作:P
编辑 2:不接受意味着如果数组中有一个 0 字节,它将无缘无故地发送。
编辑 3:我使用下面“来自莫斯科的弗拉德”的方法的修改版本解决了这个问题。仍然感谢所有尝试帮助我的人:)
编辑 4:如果有人关心:该项目正在使用蓝牙设置基于 AVR 的闹钟。
【问题讨论】:
-
好的,你试过了吗?
-
提示您入门,
i + '0'其中i是一个以 10 为基数的单个数字,将为您提供该数字的 ASCII/UTF8 字符。 -
@mafso 大多数嵌入式系统的 UART 输出硬件/接口在字节上工作,而不是 C 字符串。因此,您为它们编写的低级输出函数采用任意字节数组和长度而不是字符串是合乎逻辑的。这让你可以传递整数、浮点数、字符串,只要它是一个字节数组。当然,您在接收端的解释功能仍然需要知道传入的数据代表什么。
-
@muessigb 如果你设计了这个协议,你为什么选择以文本格式传输数字?!?那可能是一个糟糕的决定:/ ...啊,顺便说一句,便宜的人给出了一些答案...
-
@πάνταῥεῖ 是正确的。如果您要发送混合格式的数据并且您总是要在终端中将其打印出来,那么我可以理解转换为字符串,因此它需要是一个字符串。但是如果它需要是一个字符串,它需要在某个时候以零结尾。如果它没有被假定为 c 字符串的东西接收到,那么对于任何大于 999 的数字(因为您有 1 字节的标头开销),直接将值作为数字发送更节省空间。将最大 32bit-int 表示为文本需要 10 个字节而不是 4 个。