将字节从文本框转换为字节数组再转换为字符时出现奇怪的行为?

如何解决将字节从文本框转换为字节数组再转换为字符时出现奇怪的行为?

| 我有一个文本框,可用于转换以下内容:
74 00 65 00 73 00 74 00
回到一个字符串,上面说的是“ test”,但是由于某种原因,当我单击转换按钮时,它将只显示第一个字母“ t”(1),其他字节数组按预期工作,整个文本被转换。 这是我尝试的2个代码,它们产生与未将整个字节数组正确转换回word相同的行为:
byte[] bArray = ByteStrToByteArray(iSequence.Text);
ASCIIEncoding enc = new ASCIIEncoding();
string word = enc.GetString(bArray);
iResult.Text = word + Environment.NewLine;
使用以下功能:
private byte[] ByteStrToByteArray(string byteString)
{
    byteString = byteString.Replace(\" \",string.Empty);
    byte[] buffer = new byte[byteString.Length / 2];
    for (int i = 0; i < byteString.Length; i += 2)
        buffer[i / 2] = (byte)Convert.ToByte(byteString.Substring(i,2),16);
    return buffer;
}
我使用的另一种方法是:
string str = iSequence.Text.Replace(\" \",\"\");
byte[] bArray = Enumerable.Range(0,str.Length)
                            .Where(x => x % 2 == 0)
                            .Select(x => Convert.ToByte(str.Substring(x,16))
                            .ToArray();
ASCIIEncoding enc = new ASCIIEncoding();
string word = enc.GetString(bArray);
iResult.Text = word + Environment.NewLine;
试图检查长度,以查看它是否在迭代,并且是否... 真的不知道如何调试上面的字节数组为什么会发生这种情况,但是所有其他字节数组似乎都正常工作,仅此字节数组仅输出它的第一个字母。 我做错了什么会导致这种行为的方式吗? 我该怎么做才能找出问题所在?     

解决方法

        如果您有字节序列
var bytes = new byte[] { 0x74,0x00,0x65,0x73,0x74,0x00 };
然后使用ASCII编码(Encoding.ASCII)将其解码为字符串,然后得到
var result = Encoding.ASCII.GetString(bytes);
// result == \"\\x74\\x00\\x65\\x00\\x73\\x00\\x74\\x00\" == \"t\\0e\\0s\\0t\\0\"
注意Null
\\0
个字符吗?当您在文本框中显示这样的字符串时,仅显示该字符串的一部分,直到第一个Null字符为止。 由于您说的结果应为
\"test\"
,因此输入实际上不是以ASCII编码而是以UTF-16LE(Encoding.Unicode)编码。
var result = Encoding.Unicode.GetString(bytes);
// result == \"\\u0074\\u0065\\u0073\\u0074\" == \"test\"
    ,        您将unicode字符串转换为ascii,而不是在计算机上指定要转换的代码页。
System.Text.Encoding.GetEncoding(\"codepage\").GetString()
如果我的记忆正确的话。还要注意,.NET中的任何控件都是unicode ... Soooooo ....您试图在文本框中粘贴的内容(如果转换正确无误)可能是行字符..或eof的结尾,或任何形式控制字符。一切都取决于您的代码页。     ,        我尝试在VS2010中使用断点调试第一个程序。我发现那条线
string word = enc.GetString(bArray);
输出单词为\“ t \\ 0e \\ 0s \\ 0t \”。 最后一行
iResult.Text = word + Environment.NewLine;
将iResult.Text简化为\“ t \”。 所以我在想,既然\\ 0不是有效的转义序列,编译器将忽略它之后的所有内容。虽然可能是错误的,但是请尝试删除输入字符串中所有出现的00。 我不太喜欢C#。我只是建议这样做,因为它看起来像C ++。     ,        这个对我有用:
string outputText = \"t\\0e\\0s\\0t\";
outputText = outputText.Replace(\"\\0\",\" \");
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-