将字符串转换为字符串[],然后将字符串[]转换为字节[]
Posted
技术标签:
【中文标题】将字符串转换为字符串[],然后将字符串[]转换为字节[]【英文标题】:Convert string to string[] and then convert string[] to byte[] 【发布时间】:2019-10-10 19:36:21 【问题描述】:申请详情:
在 Visual Studio 2019 (Windows 10) 下开发 在UWP
平台上设计,使用C#
和XAML
语言
应用程序从远程服务器接收信息。带有套接字的连接用于双方之间的通信。
为了与服务器通信,应用程序必须以字节数组的形式发送数据,以便正确读取。
目前我使用这种方法以字节[]的形式传递我的变量:
var ID_MESSAGE_ARRAY = BitConverter.GetBytes((int)MESSAGE);
var WAY_ARRAY = BitConverter.GetBytes((int)WAY);
var SIZE_ARRAY = BitConverter.GetBytes((int)SIZE);
var TYPE_STATE_DEVICE_ARRAY = BitConverter.GetBytes((int)TYPE_STATE_DEVICE.LOGIN);
var HexString = ID_MESSAGE_ARRAY.Concat(WAY_ARRAY).Concat(SIZE_ARRAY).Concat(TYPE_STATE_DEVICE_ARRAY).Concat(ABO).ToArray();
由于这条消息,我必须发送string
。所以我用这个方法把我的string
编码成bytes[]
:
string ABONNE = "TEST";
var ABO = Encoding.ASCII.GetBytes(ABONNE);
但是我有一个问题,这个string
必须是 32 个字节,而当我在另一边解码(十六进制)时,我发现:
得到的结果:54-45-53-54
预期结果:54-45-53-54-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
要找到这个结果,我怎样才能将我的string ABONNE
传递给string[32]
,然后传递给bytes[]
?
【问题讨论】:
【参考方案1】:如果你将你的字符串直接传递给 32 字节数组怎么样:
string ABONNE = "TEST";
Byte[] ABO = new byte[32];
Encoding.ASCII.GetBytes(ABONNE,0,ABONNE.Length,ABO,0);
两个零都用于 0 索引(起始位置)。我还创建了一个空的 32 字节数组,然后用来自ABONNE
的字节填充。 请注意,如果Encoding.ASCII.GetBytes(ABONNE).Length
大于 32 字节,您将收到异常
【讨论】:
写的是一样的:这里是 MSDN 在这个特定的重载var ABO
返回 int
而不是 byte[]
@ValentinDubois-Pivot 我已经用你的改变了变量名
@val ,一些 GetBytes 返回 byte[]
但如果您传入参数,它们必须写入的字节指针或字节数组,它们将返回 int
写入的字节数。
@xdtTransform 感谢您的帮助,@ ganchito55 更改了他的答案,效果很好【参考方案2】:
使用StringBuilder
用必要数量的空值填充您的字符串。
StringBuilder sb = new StringBuilder(ABONNE);
sb.Append((char)0,32-ABONNE.Length);
更新了一个工作示例而不是伪代码。
【讨论】:
0 将导致 30 的十六进制代码,因此数组将被填充 30 30 30 而不是 00 00 00 @xdtTransform 这不是字符 '0' 它是字符 \0。 混淆源于伪代码,因为没有像这样采用 int 的重载。我留下的是0
或(char)0
。以上是关于将字符串转换为字符串[],然后将字符串[]转换为字节[]的主要内容,如果未能解决你的问题,请参考以下文章