c - 4 字节字符数组到要在 C 中的 `case` 语句中使用的整数

标签 c switch-statement byte literals

如何使用长度为 4 的 char 数组(字符串文字)来表示 4 字节整数?

我想使用长度为 4 的字符串文字来替换 4 字节整数,该整数将在本 case 语句中使用。 我想这样写:

case "\x0ATst":
    printf("FOUND TIME STAMP");
    break;

不是:

case 0x7473540A:
    printf("FOUND TIME STAMP");
    break;

因为主要代码更易于人类阅读。

我在 Google 上搜索了“string to int”,但只找到了像 atoi() 这样的答案。

最佳答案

switch 仅适用于整数常量,因此它一点也不灵活。 case 不能与表达式、字符串或 int 以外的任何其他类型一起使用。

但在这种情况下,这并不重要,因为你不应该有两种形式,因为它们都不是很可读。而是使用 case STAMP:,其中 STAMP 是一些合适的、不言自明的名称。它可以是#defineconstenum

至于如何从 4 个字符的字符串转换为 int,有多种原因导致您不能简单地执行 *(int*)"\x0ATst" (对齐、严格别名)。有一个解决方法,即使用 union :

typedef union
{
  char str[4];
  unsigned int val;
} conv_t;

...

(conv_t){.str = "\x0ATst" }.val

请注意,此代码严重依赖于 CPU 字节顺序,因此它仍然不是很好的做法。

关于c - 4 字节字符数组到要在 C 中的 `case` 语句中使用的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56790214/

相关文章:

c - 指针和结构问题

ios - 处理具有相同签名但参数不同的多个函数的最有效方法

c - gtk+/gtksourceview 如何插入行注释或 block 注释

javascript - 我可以使用带有两个变量的 case/switch 语句吗?

oop - 大型嵌套 switch 语句的设计模式

c - 在十六进制中搜索特定字节

java - 使用 JNI 仅将缓冲区的一部分从 native 代码复制到 Java

c++ - 如何从字节数组中读取 8 位位图像素颜色和位置

c - 指针在函数外部获取垃圾值,但在函数内部获取常规值

c - 在 Linux 内核中使用正则表达式