是否真的有必要unsigned char
像在一些处理字符编码或二进制缓冲区的库中一样使用二进制数据?要理解我的问题,请看下面的代码 -
char c[5], d[5];
c[0] = 0xF0;
c[1] = 0xA4;
c[2] = 0xAD;
c[3] = 0xA2;
c[4] = '\0';
printf("%s\n", c);
memcpy(d, c, 5);
printf("%s\n", d);
Run Code Online (Sandbox Code Playgroud)
两者printf's
输出 correctly, where
f0 a4 ad a2
Unicode代码点的编码U+24B62 ()
在十六进制中.
甚至memcpy
还正确地复制了char所持有的位.
什么推理可能主张使用unsigned char
而不是plain char
?
在其他相关问题unsigned char
中突出显示,因为它是唯一的(字节/最小)数据类型,保证C规范没有填充.但正如上面的例子所示,输出似乎不受任何填充的影响.
我使用VC++ Express 2010和MinGW来编译上面的内容.虽然VC给出了警告
warning C4309: '=' : truncation of constant value
输出似乎没有反映出来.
PS这可以标记为可能重复的字节缓冲区应该是有符号的还是无符号的char缓冲区?但我的意图是不同的.我在问为什么一些似乎工作正常的东西char
应该输入unsigned char
?
更新:引用N3337,
Section …
假设出于某些不正当的原因,您希望显示UTF8String的原始字节内容.
var
utf8Str : UTF8String;
begin
utf8Str := '€?????ó???';
end;
Run Code Online (Sandbox Code Playgroud)
(1)这不行,它显示可读形式:
memo1.Lines.Add( RawByteString( utf8Str ));
// output: '€?????ó???'
Run Code Online (Sandbox Code Playgroud)
(2)然而,这确实"有效" - 请注意连接:
memo1.Lines.Add( 'x' + RawByteString( utf8Str ));
// output: 'x€ąćę?‚?„???›????'
Run Code Online (Sandbox Code Playgroud)
我理解(1),虽然编译器强制转换为UnicodeString似乎阻止了原样显示RawByteString var.但是,为什么行为会在(2)中发生变化?
(3)陌生人仍然 - 让我们扭转连接:
memo1.Lines.Add( RawByteString( utf8Str ) + 'x' );
// output: '€?????ó???x'
Run Code Online (Sandbox Code Playgroud)
我一直在阅读Delphi中新奇的字符串类型,并认为我理解它们是如何工作的,但这是一个难题.
免费的Pascal文档声明该RawByteString
类型是在Free Pascal中定义的,但我无法找到它.人们应该期望它在System
单元中定义,就像在Delphi中一样,但是当我编译(使用FPC 2.6.2,{$ mode delphi})函数声明时
class function FromAnsi(const S: RawByteString): ByteArray; static;
Run Code Online (Sandbox Code Playgroud)
我得到编译器错误
Error: Identifier not found "RawByteString"
Run Code Online (Sandbox Code Playgroud)
我猜我可以自己声明这个类型:
type
RawByteString = type AnsiString(CP_NONE);
Run Code Online (Sandbox Code Playgroud)
但我想找到"原生"FPC声明.
谢谢你快速回答.由于我不需要支持FPC 1.x,我需要的解决方法是:
{$IFDEF FPC}
{$IF FPC_VERSION = 2}
{$IF FPC_RELEASE <= 6}
type
RawByteString = AnsiString;
{$IFEND}
{$IFEND}
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)