Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么';将t字节[]转换为字符串并按预期返回工作_C#_Byte - Fatal编程技术网

C# 为什么';将t字节[]转换为字符串并按预期返回工作

C# 为什么';将t字节[]转换为字符串并按预期返回工作,c#,byte,C#,Byte,我有以下代码: Int32 i1 = 14000000; byte[] b = BitConverter.GetBytes(i1); string s = System.Text.Encoding.UTF8.GetString(b); byte[] b2 = System.Text.Encoding.UTF8.GetBytes(s); Int32 i2 = BitConverter.ToInt32(b2,0);; i2等于-2777233。 为什么它不是输入值?(14000000) 编辑:我试

我有以下代码:

Int32 i1 = 14000000;
byte[] b = BitConverter.GetBytes(i1);
string s = System.Text.Encoding.UTF8.GetString(b);
byte[] b2 = System.Text.Encoding.UTF8.GetBytes(s);
Int32 i2 = BitConverter.ToInt32(b2,0);;
i2等于-2777233。 为什么它不是输入值?(14000000)


编辑:我试图将其附加到另一个字符串中,然后使用WriteAllText将其写入文件,因为
编码
类不会只用于任何事情。如果一个“字符”(在UTF-8的情况下可能是几个字节)不是该特定字符集中的有效字符(在UTF-8的情况下),它将使用替换字符

单个问号(U+003F)

(来源:)

在某些情况下,它只是一个
,例如在ASCII/CP437/ISO 8859-1中,但您可以选择如何处理它。(见上面的链接)

例如,如果您尝试将
(字节)128
转换为ASCII:

string s = System.Text.Encoding.ASCII.GetString(new byte[] { 48, 128 }); // s = "0?"
然后将其转换回:

byte[] b = System.Text.Encoding.ASCII.GetBytes(s); // b = new byte[] { 48, 63 }
您将获取原始字节数组

这可以作为参考:


我无法想象为什么需要将字节数组转换为字符串。这显然毫无意义。假设要写入流,可以直接写入
byte[]
。如果您需要在某些文本表示中使用它,只需通过
yourIntegerVar.ToString()
将其转换为字符串,然后使用
int.TryParse
将其取回,这是非常有意义的


编辑:

可以将字节数组写入文件,但不能将字节数组“连接”为字符串,并使用惰性方法
file.writealText
,因为它将处理编码转换,您可能会在文件上留下问号
。相反,请打开并使用直接写入字节数组。或者,您可以使用直接写入二进制形式的整数(以及字符串),并使用其对应项将其读回

例如:

FileStream fs;

fs = File.OpenWrite(@"C:\blah.dat");
BinaryWriter bw = new BinaryWriter(fs, Encoding.UTF8);
bw.Write((int)12345678);
bw.Write("This is a string in UTF-8 :)"); // Note that the binaryWriter also prefix the string with its length...
bw.Close();

fs = File.OpenRead(@"C:\blah.dat");
BinaryReader br = new BinaryReader(fs, Encoding.UTF8);
int myInt = br.ReadInt32();
string blah = br.ReadString(); // ...so that it can read it back.
br.Close();
此示例代码将生成一个与以下hexdump匹配的文件:

00  4e 61 bc 00 1c 54 68 69 73 20 69 73 20 61 20 73  Na¼..This is a s  
10  74 72 69 6e 67 20 69 6e 20 55 54 46 2d 38 20 3a  tring in UTF-8 :  
20  29                                               )   

请注意,还应在字符串前面加上长度前缀,并且在回读时取决于该字符串,因此不适合使用文本编辑器编辑生成的文件。(您正在以二进制形式编写一个整数,所以我认为这是可以接受的?

如果您的目标是将一个整数存储为字符串,然后返回到一个整数,除非我缺少某些内容,否则以下内容不够:

int32 i1 = 1400000;
string s = il.ToString();
Int32 i2 = Int32.Parse(s);

它不起作用,因为您正在使用反向编码

编码用于将文本转换为字节,然后再次转换为文本。您不能获取任意字节并将其转换为文本。每个字符都有一个对应的字节模式,但每个字节模式都不能转换为一个字符

如果希望以紧凑的方式将字节表示为文本,请使用base-64编码:

Int32 i1 = 14000000;
byte[] b = BitConverter.GetBytes(i1);
string s = Convert.ToBase64String(b);

byte[] b2 = Convert.FromBase64String(s);
Int32 i2 = BitConverter.ToInt32(b2, 0);

您不应该使用
Encoding.GetString
将任意二进制数据转换为字符串。该方法仅适用于使用特定编码编码为二进制数据的文本

相反,您希望使用能够可逆地表示任意二进制数据的文本表示。最常用的两种方法是base64和hex。Base64是.NET中最简单的:

string base64 = Convert.ToBase64String(originalBytes);
...
byte[] recoveredBytes = Convert.FromBase64String(base64);
对此有几点需要注意:

  • 如果要将此字符串用作URL参数,则应使用web安全版本的base64;我不知道在.NET中是否有直接的支持,但您可能很容易找到解决方案
  • 只有当您确实需要字符串格式的数据时,才应该这样做。如果您只是试图将其写入一个文件或类似文件,那么最简单的方法是将其作为二进制数据保存
  • Base64不是很容易让人读懂;如果您希望人类能够在不使用额外工具的情况下读取文本形式的数据,请使用十六进制。(关于将二进制数据转换为十六进制和反十六进制,存在各种问题。)

长话短说:

您需要将每个字节值映射到唯一字符的编码,反之亦然。 UTF8字符的长度可以是1到4字节,因此您不需要存档该映射,您需要更基本的编码,如ASCII。 不幸的是,原来的ASCII没有做到这一点,它只是一个7位编码,只定义下128个代码,上半部分(扩展代码)是特定于代码页的。要获得完整范围的翻译,您只需要一个完整的8位编码,如代码页437或850或其他:

Int32 i1 = 14000000;
byte[] b = BitConverter.GetBytes(i1);
string s = System.Text.Encoding.GetEncoding(437).GetString(b);
byte[] b2 = System.Text.Encoding.GetEncoding(437).GetBytes(s);
Int32 i2 = BitConverter.ToInt32(b2,0);

你知道字符串不是一个字节数组吗?在C和C++中,一个字符串只是一个字节数组,在结尾有0。在C#和.NET.BTW中不是这样的,
b
s
b2
Length
属性是什么?那么将int转换为字符串并返回的最佳方式是什么呢?理想情况下,字符串的长度是固定的,并且尽可能短?不清楚您的意思。您的意思是将整数转换为字符串,还是将字符串解释为整数,还是将引用指针解释为int?什么?因为我将它附加到另一个字符串,然后使用WriteAllText将其写入文件。不管怎样,你的回答已经解释了为什么我不能这样做,谢谢。这会写一个base64字符串,但OP想直接以二进制形式写4字节,所以我的回答更合适。@AlvinWong:将整数转换为4字节并不能使它成为文本,所以你的回答根本不合适。