标签: rawbytestring

C/C++为什么要对二进制数据使用unsigned char?

是否真的有必要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 a2Unicode代码点的编码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 …

c c++ bytebuffer character-encoding rawbytestring

51
推荐指数
4
解决办法
2万
查看次数

Delphi 2009 RawByteString变幻莫测

假设出于某些不正当的原因,您希望显示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中新奇的字符串类型,并认为我理解它们是如何工作的,但这是一个难题.

delphi unicode utf-8 delphi-2009 rawbytestring

5
推荐指数
1
解决办法
3228
查看次数

Free Pascal中的RawByteString类型

免费的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)

delphi rawbytestring fpc

2
推荐指数
1
解决办法
722
查看次数