arduino int转char_Arduino 数据类型转换

2023-05-16

使用过Python的数据类型后,会发现C/C++的数据类型比较单一。Arduino实际上是C++,除了基础数据类型,增加了String类。通过了解标准库和类的头文件,可以减少不必要的、重复的、琐碎的、易错的手工代码。除了Arduino,其他的GCC和嵌入式C语言中也可以参照执行。

IoT相关数据类型

byte, unsigned char

char

int, int and unsigned int

float

String,class of char array

struct

IoT需要解决的主要是采集、传输、判断、控制。传输通道上数据以二进制数据为主。

C语言设计中,二进制数据采用unsigned char[],使用简单。二进制处理采用struct结构体可以很好地解决固定长度的unsigned char[]。但是动态长度的传输协议的结构体往往需要包含额外的缓冲区指针。

C语言中,字符串采用char[],即字符数组来实现。但是无论是初始化、转换、处理起来,代码都很琐碎。所以ANSI标准的C语言标准库中提供了大量的面向字符以及字符串的函数。在Java/C++等OOP语言中,也都定义String类。注意,这些是类(class),而非数据类型(type)。

由于IoT引入了许多Web协议,而大多数Web协议如HTTP/FTP/Telnet都基于字符串。所以许多情况下,代码需要在这两种协议之间进行转换。所以unsigned char和char是最基础的数据类型。

unsigned char和char可以通过强制类型转换来实现。但是unsigned char[],char[],String三者之间却有着一定的差异,主要因为char[]/String定义的字符串结束符必须使用NULL,即\0来实现。在某些特殊情况下会因为两种数据类型长度不一致,或者缺乏NULL结束符导致程序跑飞。

String类

在Arduino的WString.h/WString.cpp中可以找到对应的String类定义。

inline void String::init(void) {

buffer = NULL;

capacity = 0;

len = 0;

}

WString.cpp引用了stdlib_noiso.h这个头文件,也就是底层依然调用了libc来实现一些功能。在构建函数中,可以看到其调用utoa(),itoa(),ltoa()等stdlib.h中定义的函数。

类型转换

虽然C语言是理工科大学必修课程,但是在MCU级别使用C语言却是在工作中。从Keil的C51语言开始,因为资源受限,实际工程中很少使用标准库,一些小的常用函数都是自己写的,目的是通过不同模块的缓冲区复用(overlap)实现少占用RAM空间。而现在STM32/ESP8266的RAM都比之前8051 256B要多许多,使用标准库和类库以实现标准化开发,可以明显加快开发。

当然,不必将所有的库和类库都背下来,可以在使用中摸索出操作的常用函数,然后在标准库和类库中去寻找对应物。

String to char array

String to byte array

String to int

String to float

各种库

不同C编译器环境有着类似(ANSI C libc)但是有细微差异的库(glibc)。需要自行检索。

stdlib.h,libc的一部分,包含了部分str转其他类型的函数定义。

ctypes.h, libc的一部分,包含了字符char的函数定义。

string.h, libc的一部分,包含了大多数字符串操纵如复制、检索、比较等函数定义。

Wstring.h,Arduino自定义的String类,依赖于stdlib.h/string.h的函数。

Wcharater.h,Arduino定义的字符类型操作,如判断、转换。依赖于ctype.h的转换函数。

#include

// string to double or float

double atof(const char *s);

float atoff(const char *s);

// string to integer

int atoi(const char *s); // = (int)strtol(s, NULL, 10);

long atol(const char *s); // = strtol(s, NULL, 10);

// double or float to string

char *ecvt(double val, int chars, int *decpt, int *sgn);

char *ecvtf(float val, int chars, int *decpt, int *sgn);

char *fcvt(double val, int decimals, int *decpt, int *sgn);

char *fcvtf(float val, int decimals, int *decpt, int *sgn);

// format double or float as string

char *gcvt(double val, int precision, char* buf);

char *gcvtf(float val, int precision, char* buf);

// double or float to string

char *ecvtbuf(double val, int chars, int *decpt, int *sgn, char *buf);

char *ecvtfbuf(float val, int chars, int *decpt, int *sgn, char *buf);

// integer or unsigned int to string

char *itoa(int value, char *str, int base);

char *utoa(unsigned value, char *str, int base);

// string to double or float

double strtod(const char *restrict str, char **restrict tail);

float strtof(const char *restrict str, char **restrict tail);

// string to long or unsigned long

long strtol(const char *restrict s, char **restrict ptr, int base);

unsigned long strtoul(const char *restrict s, char **restrict ptr, int base);

// binary search

void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *));

#include

int isalnum(int c); // is alphanumberic

int isalpha(int c); // is alphabetic

int isascii(int c); // is ASCII char

int isblank(int c); //

int iscntrl(int c);

int isdigit(int c);

int islower(int c);

int isprint(int c); // is printable

int ispunct(int c); // punctuation

int isspace(int c); // is space

int isupper(int c);

int isxdigit(int c); // is hexdecimal digit

int toascii(int c); // force to ascii, by clearing MSB

int tolower(int c);

int toupper(int c);

#include

int bcmp(const void *s1, const void *s2, size_t n); // = memcmp

int bcopy(const void *in, void *out, size_t n); // = memmove

void bzero(void *b, size_t length);

char *index(const char *string, int c); // = strchr

void *memccpy(void *restrict out, const void *restrict in, int endchar, size_t n);

void *memchr(const void *src, int c, size_t length);

int memcmp(const void *s1, const void *s2, size_t n);

void *memcpy(void *restrict out, const void *restrict in, size_t n);

char *memmem(const void *s1, size_t l1, const void *s2, size_t l2);

void *memmove(void *dst, void *src, size_t length);

void *memrchr(const void *src, int c, size_t length);

void *memset(void *dst, int c, size_t length);

void *rawmemchr(const void *src, int c);

void *rindex(const char * string, int c);

char *strpcpy(char *restrict dst, const char *restrict src);

char *strncpy(char *restrict dst, const char *restrict src, size_t length);

int strcasecmp(const char *a, const char *b);

char *strcasestr(const char *s, const char *find);

char *strcat(char *restrict dst, const char *restrict src);

char *strchr(const char *string, int c);

char *strchrnul(const char *string, int c);

int strcmp(const char *a, const char *b);

char *strcpy(char *dst, char *src);

size_t strlen(const char *str);

char *strlwr(char *a);

int strncasecmp(const char *a, const char *b, size_t length);

char *strncat(char *restrict dst, const char *restrict src, size_t length);

int strncmp(const char *a, const char *b, size_t length);

char *strncpy(char *restrict dst, const char *restrict src, size_t length);

size_t strlen(const char *str, size_t length);

char *strpbrk(const char *s1, const char *s1);

char *strrchr(const char *string, int c);

char *strstr(const char *s1, const char *s2);

char *strtok(char *restrict source, const char *restrict delimiters);

仔细阅读Arduino的WString/WCharater的头文件,其底层依然是依赖于标准库libc。

其他操作

Python编写IoT应用时,有些特殊的操作,是没有C语言对应物的,都需要自己去编写。比如split()切割字符串等。

Web URLs

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

arduino int转char_Arduino 数据类型转换 的相关文章

  • 不使用局部变量的值

    上述所有变量的标题中都有警告 你能告诉我为什么会这样吗 public class DataTypes public static void main String argv new feature in JDK 7 int x 0b1010
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 正则表达式可以与 C++ 中的字符数组一起使用吗

    我正在开发一个无法使用字符串库文件的程序 而是使用字符数组 我能够使用正则表达式 并且想知道是否有办法使用正则表达式和字符数组 甚至正则表达式和单个字符 我问的原因是当我尝试在匹配中使用我的 char 数组时 xUtility 会抛出一堆来
  • 将 char 绑定到枚举类型

    我有一段与此非常相似的代码 class someclass public enum Section START MID END vector section Full void ex for int i 0 i section
  • PHP 中 (int) $_GET['page'] 是什么意思?

    我试着抬头看 int 但只能找到该函数的文档int 在 PHP 手册中 有人可以向我解释一下上面的代码是做什么的 以及它到底是如何工作的吗 它将 至少尝试 将变量的值转换为整数 如果有字母等 前面会转成0
  • 将 int 和 const int 转换为 float 时的不同结果

    谁能解释为什么 int 和 const int 给出不同的结果 转换为 float 并用于浮点数学时的结果 参见 例如这段代码 int tmain int argc TCHAR argv int x 1000 const int y 100
  • Java在字符串中看不到空格[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 因此 我正在尝试解析一些具有多行文本的文本文件 我的工作是检查所有单词并将其打印在文件中 因此 我读取了所有行 循环遍历它们并用空格分隔每
  • 计算 Int32 中的前导零

    如何计算一个数组中的前导零Int32 所以我想做的是写一个函数 如果我的输入是 2 它返回 30 因为在二进制中我有000 0000000000010 NOTE使用 dotnet core gt 3 0 看here https stacko
  • Arduino 串行输出丢弃字符

    当我尝试为我的 Arduino Uno 编写一些代码时 我遇到了一个奇怪的串行输出 我有这个原始代码 MyClass myclass void setup Serial Begin 9600 Serial println Starting
  • Arduino CLI 编译器“ino”和一些基本草图导致编译错误

    我正在尝试使用 cli 编译器 ino 编译基本的以太网 UDP Sketch 我从他们的 github 存储库下载了最新版本 ino init然后是 src sketch ino 的内容 include
  • 无论实现如何,'a' 到 'z' 的 ASCII 值不是从 97 到 122 连续的吗?一本好书另有说法[重复]

    这个问题在这里已经有答案了 我认为以下程序没有任何问题 并且不可移植性让我感到非常困惑 根据迈克 巴纳汉的书 GBdirect C 书 第 2 4 2 节 http publications gbdirect co uk c book ch
  • 如何使用 Java 本机接口将字节数组传递到以 char* 作为参数的 C 函数中?

    所以我需要使用JNI从java调用C函数 当传入不同的数据类型 创建本机变量 头文件 共享库等等 时 我已经能够成功地做到这一点 但无法让它与字节数组一起使用 这是我的 C 函数 include
  • 是否值得为 EEPROM 实现小型文件系统

    我买了一个I2C EEPROM 我想存储传感器和电压数据 我假设该值可以大于一个字节 并且可以有很多数据 在这种情况下是否值得实现具有小文件分配表的文件系统 例如 这会让我更容易查看 EEPROM 我发现 EEPROM 上出现 FAT 有两
  • 关于 unsigned int 的建议(江南 Style 版)

    视频 江南Style 我相信你已经听过 在 YouTube 上的观看次数刚刚突破 20 亿次 事实上 谷歌表示他们从未期望视频大于 32 位整数 这暗示了谷歌使用的事实 int 代替unsigned对于他们的观察柜台 我认为他们必须重新编写
  • 将int转换为无符号短java

    我用 java 编写了一个 obj 解析器来对 iPhone 上的 3D 对象进行建模 我想将数据导出为二进制文件 该文件必须尽可能小 我有很多适合无符号短整型的索引 但它们在 java 中表示为 int 我想在将数据写入文件之前使用 By
  • 负字符值JAVA

    为什么会出现以下情况 char p 0 p System out println p result 65535 为什么不给出编译错误或运行时异常 我预计它是因为字符不能为负数 相反 它从颠倒开始倒数 提前致谢 为什么不给出编译错误或运行时异
  • C++ int 转字节数组

    我的 java 代码中有这个方法 它返回给定 int 的字节数组 private static byte intToBytes int paramInt byte arrayOfByte new byte 4 ByteBuffer loca
  • 使用 avr-gcc 编译器/链接器对链接 avrfix 库中函数的未定义引用

    我正在尝试使用avrfix 库 http avrfix sourceforge net 在一个项目中 使用Eclipse v4 2 2 作为IDE avr gcc作为编译器 头文件 avrfix h 和库文件 libavrfix a 都包含
  • C-为什么char c=129会转换成-127?

    如果我们分配 128到 char 变量 然后将其转换为 128因为二进制等价 10000000 first bit tells sign 二进制等价于129 is 10000001 它将转换成什么值 字符c 129 谢谢 S 实际上有几种可
  • Java中char数组的默认值是多少?

    如果我像这样分配字符数组 char buffer new char 26 它分配的默认值是什么 我尝试打印它 但它只是一个空字符 System out println this is what is inside gt buffer 1 t

随机推荐