将字符串转换为字符串[],然后将字符串[]转换为字节[]

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

以上是关于将字符串转换为字符串[],然后将字符串[]转换为字节[]的主要内容,如果未能解决你的问题,请参考以下文章

python之struct详解

16进制字符串如何转化16进制数值

将C的char数组转换为C++的字符串

在PHP中将标签转换为字符串[重复]

Python struct模块

Base 64 原理