在char*和UBYTE*之间进行类型转换(无符号char*)

在char*和UBYTE*之间进行类型转换(无符号char*),c,pointers,char,unsigned,C,Pointers,Char,Unsigned,背景:作为套接字会话的一部分,我正在以char*的形式接收一个数组。现在我们必须匹配其中的令牌(HTTP头)。这里的代码是我们创建了一个UBYTE*并在使用UBYTE进行类型转换后从char数组中获取值。稍后,我们将同一个UBYTE指针传递给另一个函数,该函数在将char*类型转换为char*后接受char* 这里的问题是,它在发布版本中工作,而不是在调试版本中(使用-g和不同的优化)。不仅如此,在调试模式下添加少量打印还隐藏了问题 我的问题是,UByte指针(本质上是一个无符号字符)和char

背景:作为套接字会话的一部分,我正在以char*的形式接收一个数组。现在我们必须匹配其中的令牌(HTTP头)。这里的代码是我们创建了一个UBYTE*并在使用UBYTE进行类型转换后从char数组中获取值。稍后,我们将同一个UBYTE指针传递给另一个函数,该函数在将char*类型转换为char*后接受char*

这里的问题是,它在发布版本中工作,而不是在调试版本中(使用-g和不同的优化)。不仅如此,在调试模式下添加少量打印还隐藏了问题


我的问题是,UByte指针(本质上是一个无符号字符)和char指针有什么区别。将UByte改为char在所有模式下都能解决我的问题,但我没有任何相同的解释?有什么想法吗?

char*
unsigned char*
之间进行转换没有什么错。如果您获得的意外行为因优化级别而异,那么代码中肯定存在错误,但这可能与丢弃强制转换中的符号无关


除此之外,
UBYTE
是一个非常荒谬的类型定义,因为存在一个标准的C类型,
uint8\u t
,它是相同的,在
stdint.h
中定义
char*
unsigned char*
之间转换没有错。如果您获得的意外行为因优化级别而异,那么代码中肯定存在错误,但这可能与丢弃强制转换中的符号无关


除此之外,
UBYTE
是一个非常荒谬的typedef,因为存在一个标准的C类型,
uint8\u t
,它是相同的,并且在
stdint.h

中定义。也许你可以首先解释一下,为什么你必须首先使用
无符号字符?
什么是不工作

void*
char*
unsigned char*
具有不同的语义,您应该根据以下内容使用它们:

  • void*
    指向非特定数据,除非将其转换为某个实际类型,否则无法使用这些数据执行任何操作
  • 不幸的是,
    char*
    有两种不同的含义,要么作为文本字符串,要么作为非特定数据,但可以在低(字节)级别寻址(修补)
  • signed char
    unsigned char
    是要对其执行算术运算的小宽度整数

也许您可以首先解释一下,为什么您认为必须首先使用
无符号字符
? 什么是不工作

void*
char*
unsigned char*
具有不同的语义,您应该根据以下内容使用它们:

  • void*
    指向非特定数据,除非将其转换为某个实际类型,否则无法使用这些数据执行任何操作
  • 不幸的是,
    char*
    有两种不同的含义,要么作为文本字符串,要么作为非特定数据,但可以在低(字节)级别寻址(修补)
  • signed char
    unsigned char
    是要对其执行算术运算的小宽度整数

@R.,稍微更正一下,
unit8\t
的存在是由POSIX强制执行的,而不是由C强制执行的。如果存在8位整数类型,C保证它存在。如果不存在8bit类型,那么也不可能定义自己的“UBYTE”。因为这个问题是关于处理HTTP头的,所以目标几乎肯定是配备了处理网络数据单元(字节)的平台<代码>字符位=8
确实是一种不值得一提的病理学。它永远不会发生,除非是在传统机器上的DSP和grandfathered上,这些机器永远不会成为可移植程序的目标。@R,他们将其命名为UBYTE并不意味着它的宽度为8。如果它的宽度不是8,那么将它命名为“UBYTE”的大脑损伤比我想象的要多1000倍…@R.,稍微更正一下,
unit8\t
的存在是由POSIX强制执行的,而不是由C强制执行的。如果存在8位整数类型,C保证它的存在。如果不存在8bit类型,那么也不可能定义自己的“UBYTE”。因为这个问题是关于处理HTTP头的,所以目标几乎肯定是配备了处理网络数据单元(字节)的平台<代码>字符位=8确实是一种不值得一提的病理学。它永远不会发生,除非是在传统机器上的DSP和grandfathered上,这些机器永远不会成为可移植程序的目标。@R,他们将其命名为UBYTE并不意味着它的宽度为8。如果它的宽度不是8,那么将它命名为“UBYTE”的大脑损伤比我想象的要多1000倍……我选择使用char*的原因是使用相同的数据类型。函数1调用函数2(传递char*参数)。函数2将其复制到本地Ubyte*。函数2调用函数3(它接受char*)。因此,在我看来,函数2充当了从函数1到函数3的传递,不必要地将其更改为UBYTE,从而增加了类型转换或引用/取消引用指针的开销。PS:我看不出我的代码有任何逻辑问题,因为当前的代码在发行版(O2)和调试版(O3,g)中都能工作,并在有问题的函数中有额外的打印。谢谢Jen的回复和见解。我只是想说清楚,我并不满意。我随身携带着旧的书面代码,随着时间的推移,人们在舒适的环境下改变了代码。对于生产代码,我的意思是解析函数没有逻辑问题,因为它运行了很长时间。我只是想找出Char*和UBYTE*之间的合理区别。可能我只坚持这一点是错误的,我应该研究代码的其他方面-(@Ayan,我想在这种情况下很难找到什么。Bu