关于 BYTE 类型的 strlen() 的警告

Posted

技术标签:

【中文标题】关于 BYTE 类型的 strlen() 的警告【英文标题】:warning about strlen() on BYTE type 【发布时间】:2019-05-07 14:54:08 【问题描述】:

我正在尝试使用 sha256 计算某些单词的哈希值,但是当我使用 sha256_update() 函数时,

typedef unsigned char BYTE;
BYTE text1[] = "abcd";
sha256_update(&ctx, text1, strlen(text1));

在 BYTE 类型上使用 strlen() 会给我一些警告,所以我想知道获取 text1 长度的正确方法是什么?

In file included from /usr/include/memory.h:29:0,
             from sha256-test.c:16:
/usr/include/string.h:384:15: note: expected ‘const char *’ but argument is of type ‘BYTE aka unsigned char’
 extern size_t strlen (const char *__s)
           ^~~~~~
sha256-test.c:54:36: warning: pointer targets in passing argument 1 of ‘strlen’ differ in signedness [-Wpointer-sign]
  sha256_update(&ctx, text1, strlen(text1));

【问题讨论】:

text1是一个字符串数组,应该是strlen(text1[0]) 将参数转换为(const char *) 我想知道为什么错误消息说参数的类型是BYTE 而不是BYTE * 请显示导致错误的实际代码。错误消息似乎与 BYTE text2 = "abcd"; 之类的代码有关,变量名称后没有 []。, 贴出真实的代码,而不是你为 SO 而做的东西。 【参考方案1】:

看起来typedef名称BYTE是这样定义的

typedef unsigned char BYTE;

在这种情况下,将类型 unsigned char * 转换为类型 char * (或 const char * ),因为类型之间没有隐式转换。例如

BYTE text1[] = "abcd";
sha256_update(&ctx, text1, strlen( ( char * )text1 ) );

考虑到数组的这种初始化

BYTE text1[] = "abcd";

(当数组的大小由其初始化字符串确定时)您也可以通过以下方式获取字符串的长度

sizeof( text1 ) - 1

这是一个演示程序

#include <string.h>
#include <stdio.h>

typedef unsigned char BYTE;

int main( void )

    BYTE text1[] = "abcd";
    size_t n = strlen( ( char * )text1 );

    printf( "n = %zu\n", n );
    printf( "sizeof( text1 ) - 1 = %zu\n", sizeof( text1 ) - 1 );

它的输出是

n = 4
sizeof( text1 ) - 1 = 4

【讨论】:

以上是关于关于 BYTE 类型的 strlen() 的警告的主要内容,如果未能解决你的问题,请参考以下文章

关于strlen和sizeof的使用

Redis(*^▽^*)活学活用---五种数据类型(持续更新中...)

Java语言中关于数据类型的一些总结

连接到 MySQL 数据库时有关 SSL 连接的警告

关于不同类型字符的转换

Netbeans 警告类型转换太强,但如果删除转换则会出错