gpt4 book ai didi

c# - 在 .Net 字符串中表达大于 127 的字节值

转载 作者:行者123 更新时间:2023-12-02 14:11:37 24 4
gpt4 key购买 nike

我正在使用字符串在 .Net 中编写一些二进制协议(protocol)消息,除了一种特殊情况外,它大部分都可以工作。

我要发送的消息是:

String cmdPacket = "\xFD\x0B\x16MBEPEXE1.";  
myDevice.Write(Encoding.ASCII.GetBytes(cmdPacket));

(为了帮助解码,这些字节为 253、11、22,然后是 ASCII 字符:“MBEPEXE1。”)。

除非当我执行Encoding.ASCII.GetBytes时,0xFD会以字节0x3F的形式出现(值 253 更改为 63)。

(我应该指出,\x0B\x16 被正确解释为 Hex 0BHex 16)

我也尝试过 Encoding.UTF8Encoding.UTF7,但没有成功。

我觉得可能有一个很好的简单方法来在字符串中表达 128 以上的值,并将它们转换为字节,但我缺少它。

有什么指导吗?

最佳答案

无论您所做的事情是好还是坏,编码ISO-8859-1都会将其所有字符映射到Unicode中具有相同代码的字符。

// Bytes with all the possible values 0-255
var bytes = Enumerable.Range(0, 256).Select(p => (byte)p).ToArray();

// String containing the values
var all1bytechars = new string(bytes.Select(p => (char)p).ToArray());

// Sanity check
Debug.Assert(all1bytechars.Length == 256);

// The encoder, you could make it static readonly
var enc = Encoding.GetEncoding("ISO-8859-1"); // It is the codepage 28591

// string-to-bytes
var bytes2 = enc.GetBytes(all1bytechars);

// bytes-to-string
var all1bytechars2 = enc.GetString(bytes);

// check string-to-bytes
Debug.Assert(bytes.SequenceEqual(bytes2));

// check bytes-to-string
Debug.Assert(all1bytechars.SequenceEqual(all1bytechars2));

来自wiki :

ISO-8859-1 was incorporated as the first 256 code points of ISO/IEC 10646 and Unicode.

或者一个简单而快速的方法,将字符串转换为byte[](使用未选中选中 > 变体)

public static byte[] StringToBytes(string str)
{
var bytes = new byte[str.Length];

for (int i = 0; i < str.Length; i++)
{
bytes[i] = checked((byte)str[i]); // Slower but throws OverflowException if there is an invalid character
//bytes[i] = unchecked((byte)str[i]); // Faster
}

return bytes;
}

关于c# - 在 .Net 字符串中表达大于 127 的字节值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18131357/

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