C++ - 不正确的ASCII值("ë")

use*_*626 5 c++ png ascii decoder

首先,我为我所犯的任何英语错误道歉,但是15岁和法语没有帮助......

我正在尝试使用文件格式规范(http://www.libpng.org/pub/png/spec/1.2/PNG-Contents.html)编写PNG解码器,但我遇到了一个奇怪的问题.

规范说PNG文件的前八个字节总是包含以下(十进制)值:137 80 78 71 13 10 26 10.

当我测试这个简单的程序时:

int main() 
{
    ifstream file("test.png");

    string line;
    getline(file, line);

    cout << line[0] << endl;
}
Run Code Online (Sandbox Code Playgroud)

输出为"ë",表示ascii表中的137.好,它匹配第一个字节.

但是,当我这样做时int ascii_value = line[0];,输出值是-119,这不是正确的ascii值.

当我用另一个字符"e"尝试同样的事情时,它会输出正确的ascii值.

有人可以解释我做错了什么,解决方案是什么?我个人认为这是扩展的ascii表的一个问题,但我不确定.

谢谢大家 !我会将我签名的字符转换为未签名的字符!

unw*_*ind 10

您的系统char类型已签名,这就是为什么其值可能为负的原因.

你需要明确并放弃标志:

const unsigned char value = (unsigned char) line[0];
Run Code Online (Sandbox Code Playgroud)

请注意,机器似乎正在使用的二进制补码中-119 = 137 .这些位本身确实是正确的,所有这些都是正确地解释它们.


Kon*_*lph 5

char在C++中可以是有符号或无符号1),它取决于它的实现.对于您的编译器(实际上与大多数情况一样),它似乎是签名的:

任何字符值> 128都表示为负数.-119恰好对应于无符号字符值137.换句话说,以下成立:

unsigned char c = 137;
assert(static_cast<signed char>(c) == -119);
Run Code Online (Sandbox Code Playgroud)

但请注意,这是特定于实现的,因此您通常不能依赖这些值.


1)并且是独特的类型从两个signed charunsigned char.