gpt4 book ai didi

char * 与 unsigned char * 和转换

转载 作者:太空宇宙 更新时间:2023-11-04 03:39:58 25 4
gpt4 key购买 nike

我需要使用 SQLite 函数 sqlite3_prepare_v2() ( https://www.sqlite.org/c3ref/prepare.html )。

此函数将 const char * 作为其第二个参数。

另一方面,我准备了一个 unsigned char * 变量 v,它包含如下内容:

INSERT INTO t (c) VALUES ('amitié')

以十六进制表示(我剪掉了这行):

49 4E 53 45 52 54 20 49 4E 54 4F 20 74 20 28 63 29
20 56 41 4C 55 45 53 20 28 27 61 6D 69 74 69 E9 27 29

注意 0xE9 代表字符 é

为了正确构建这段代码,我将变量 v 转换为 (const char *) ,当我将它作为参数传递给sqlite3_prepare_v2() 函数...

您对这个 Actor 有什么评价?真的非常非常糟糕吗?

请注意,我一直在使用 unsigned char * 指针来仅用一个字节存储 0x000xFF 之间的字符。

源数据来自 ANSI 编码文件。

sqlite3_prepare_v2() 函数的文档中,我还阅读了该函数第二个参数的以下注释:

/* SQL statement, UTF-8 encoded */

让我烦恼的是函数第二个参数的类型const char *...我本来期待一个const unsigned char *...

对我来说——但话又说回来,我可能完全错了——一个字符(一个字节)中只有 7 个有用位,最高有效位(最左边)用于表示字节的符号...

我想我在这里遗漏了一些要点......

感谢您的帮助。

最佳答案

你是对的。

对于 UTF-8 输入,sqlite3_prepare_v2 方法实际上应该请求 const unsigned char *,因为所有 8 位都用于数据。他们的实现当然不应该使用带符号的比较来检查最高位,因为一个简单的编译器标志可以将 char 的默认值设置为 unsigned signed 前者会破坏密码。

至于您对 Actor 阵容的担忧,这是比较温和的担忧之一。放弃 intfloat 上的符号通常是非常糟糕的事情 (TM) - 或者至少是您遇到问题的明确指示。

在处理纯 ASCII 时,有 7 位数据是正确的,但剩余的第 8 位用于奇偶校验位,而不是符号位。

关于char * 与 unsigned char * 和转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29492960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com