【问题标题】:WideChar to Bytes?WideChar 到字节?
【发布时间】:2013-03-01 13:22:21
【问题描述】:

我在这里有一个简单的问题。如何在 Delphi - 7 中将WideChar 转换为 2xByte?我搜索了互联网和StackOverflow,但没有结果...

【问题讨论】:

    标签: delphi bytearray byte widechar


    【解决方案1】:

    David 给了你更好的方式,即,

    var
      b1, b2: Byte;
      wc: WideChar;
    
    ...
    
    b1 := WordRec(wc).Lo;
    b2 := WordRec(wc).Hi;
    

    其他一些选项(只是为了好玩):

    b1 := Lo(Word(wc));
    b2 := Hi(Word(wc));
    

    和

    b1 := Byte(wc);
    b2 := Byte(Word(wc) shr 8);
    

    和

    b1 := PByte(@wc)^;
    b2 := PByte(NativeUInt(@wc) + 1)^;
    

    和

    var
      wc: WideChar;
      bytes: WordRec absolute wc;
    
    begin
    
      // Magic! The bytes are already found in bytes.Lo and bytes.Hi!
    

    【讨论】:

    • 我更愿意将 char 转换为 Lo 和 Hi 函数参数的本机数据类型,因此我将使用 Lo(Integer(wc)); 和 Hi。绝对指令 magic 在我看来是最简单的,但我会使用bytes: array[0..1] of Byte absolute wc;,因为这个问题要求字节,而不是WordRec。 [+1ed]
    • @TLama 你认为 WordRec 的字段是什么类型的?另外,Lo和Hi有点奇怪。它们接受 32 位整数,但忽略最高有效的 16 位。它们是 16 位的遗留问题。
    • @David,我知道WordRec 的字段是字节,但在我看来它的可读性较差!
    • @TLama 好的,我明白你的意思了。 Hi 和 Lo 成员的优势在于您知道他们在哪个方向。不过,我真的不喜欢那些固有的 Lo 和 Hi 16 位功能。言语太奇怪了。由于隐式类型转换,也容易出错。只是我的看法。
    • @Andreas 好吧。看起来我应该列出所有不同的方式!
    【解决方案2】:

    有很多方法可以做到这一点。例如,我个人的选择是:

    var
      b1, b2: Byte;
      wc: WideChar;
    
    ....
    
    b1 := WordRec(wc).Lo;
    b2 := WordRec(wc).Hi;
    

    【讨论】:

    • 我不会列举所有其他方法。很想知道有多少真正不同的版本。
    猜你喜欢
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 2012-01-04
    • 2012-12-25
    • 1970-01-01
    相关资源
    最近更新 更多