【计组】2.1.1.进位计数制

本文详细介绍了进位计数制的概念,包括基数定义、真值与机器数的区别,重点讲解了二进制、八进制、十六进制之间的转换方法,以及如何将十进制转换为其他进制系统。例题展示了具体的转换过程。

进位计数制

名词解释

  • 基数:每个数码位所用到的不同符号的个数,r 进制的基数为 r
  • 真值:符合人类习惯的数字
  • 机器数:数字实际存到机器里的形式,正负号需要被“数字化”

记忆点

  1. 二进制:0,1
  2. 八进制:0 - 7
  3. 十进制:0 - 9
  4. 十六进制:0 - 9,A - F
  5. 二进制、八进制、十六进制互转:11111111.11(二进制)= 011|111|111.110(八进制)=1111|1111.1100(十六进制)
  6. 十进制转 N 进制(整数):除 N 求余数,用商继续求余数,最后从后往前写余数
  7. 十进制转 N 进制(小数部份):乘 N 取整数部份,用积的小数部份继续求整数,最后从前往后写整数部份

例题

  1. 二进制:101.1,十进制等于?
    答:1 * 22 + 0 * 2 1 + 1 * 20 + 1 * 2-1 = 5.5
<think>我们面对的错误是:`Uncaught SyntaxError: Unexpected non-whitespace character after JSON at position 54 (line 1 column 55)` 这个错误发生在`guideCheck.js`的第177行,在`JSON.parse`方法中。根据错误信息,我们知道在解析JSON字符串时,在第54个字符位置(从0开始计数)遇到了一个非空白字符,而这个字符是不符合JSON格式的,导致解析失败。 根据引用[4]中的案例,这种错误通常是因为我们尝试解析一个不是JSON格式的字符串为JSON对象。可能的原因包括: 1. 服务器返回的数据不是JSON格式(比如是HTML、普通文本等)。 2. 服务器返回的JSON格式不合法(比如在JSON字符串中包含了未转义的特殊字符,或者有多余的字符)。 同时,引用[5]提到了一个参数传递错误的例子:在调用`deleteUser`方法时,直接传递了`row.id`(一个原始值)而不是一个对象,导致后端可能返回了错误信息(非JSON格式),而前端又试图用`JSON.parse`去解析,从而报错。 在您的错误信息中,我们注意到: - 错误发生在`guideCheck.js`的第177行,在`success`回调函数中。 - 调用栈显示,这是一个通过jQuery的ajax请求返回后的处理。 因此,我们可以按照以下步骤进行排查: ### 步骤1:检查服务器返回的数据 在浏览器开发者工具中,打开Network(网络)选项卡,找到触发这个错误的请求,查看其响应内容。 - 确认响应头中的`Content-Type`是否为`application/json`(或者类似表示JSON的MIME类型)。 - 查看响应的实际内容,特别是第54个字符左右的位置,看是否有非法字符,或者整个响应是否根本不是JSON。 例如,如果服务器返回了一个错误页面(HTML),那么开头可能是`<!DOCTYPE html>`,这样的字符串在解析JSON时显然会出错。 ### 步骤2:检查前端代码 在`guideCheck.js`中,找到第177行附近的代码,大致结构可能如下: ```javascript $.ajax({ url: ..., success: function(data) { // 第177行附近:可能是 JSON.parse(data) 或者类似的操作 } }); ``` 注意:如果服务器返回的是JSON格式,jQuery的ajax方法在`dataType`为`'json'`(或者没有指定但响应头正确)时,会自动将响应解析为JavaScript对象,那么就不需要再调用`JSON.parse`。但是,如果代码中手动调用了`JSON.parse`,那么当服务器返回的不是字符串而是已经解析好的对象时,就会出错(因为`JSON.parse`要求参数是字符串)。或者,如果服务器返回的是非JSON字符串,手动解析也会出错。 所以,请检查: - 是否在`success`回调中又对数据进行了`JSON.parse`?如果是,那么可能重复解析了。 - 是否在ajax设置中指定了`dataType: 'json'`?如果是,jQuery已经解析过了,那么`data`已经是对象,不能再解析。 ### 步骤3:检查请求参数 根据引用[5]的例子,如果请求参数传递不正确,可能导致服务器返回错误信息(非JSON)。因此,检查触发这个请求的代码,特别是传递的参数是否符合服务器要求。 ### 解决方案 1. **如果服务器返回的是非JSON数据**: - 需要与后端开发人员确认接口返回的数据格式,确保其返回的是合法的JSON字符串,并且响应头`Content-Type`设置为`application/json`。 - 如果后端无法修改(比如返回错误信息时是文本),那么前端需要根据实际情况处理:在解析前判断内容,或者捕获异常。 2. **避免重复解析**: - 如果ajax请求已经设置了解析JSON(通过`dataType: 'json'`),那么就不需要再调用`JSON.parse`。 - 修改代码,去掉多余的`JSON.parse`。 3. **增强代码健壮性**: - 在解析JSON的地方使用`try...catch`,避免整个脚本因解析错误而停止。 ```javascript try { var obj = JSON.parse(data); } catch (e) { console.error('解析JSON失败:', e); console.log('原始数据:', data); // 进行错误处理,例如显示错误信息 } ``` 4. **检查请求参数**: - 确保传递给后端的数据格式正确,特别是当使用POST请求时,传递的数据应该是JSON字符串(需要设置`contentType: 'application/json'`)或者表单数据。 ### 示例代码修正 假设原始代码是这样的: ```javascript $.ajax({ url: 'api/guideCheck', type: 'POST', data: JSON.stringify({ id: 123 }), // 发送JSON数据 contentType: 'application/json', dataType: 'json', // 期望返回JSON,jQuery会自动解析 success: function(data) { // 因为设置了dataType: 'json',data已经是对象,无需再解析 // 错误示例:var obj = JSON.parse(data); // 这会导致错误,因为data不是字符串 console.log(data); }, error: function(xhr) { console.error('请求失败'); } }); ``` 如果错误是因为返回的数据不是JSON,比如在错误时返回了HTML,那么我们需要在error回调中处理: ```javascript // 去掉dataType,这样jQuery就不会尝试自动解析,然后我们在success中根据内容类型处理 $.ajax({ url: 'api/guideCheck', type: 'POST', data: JSON.stringify({ id: 123 }), contentType: 'application/json', success: function(data, textStatus, xhr) { var contentType = xhr.getResponseHeader('Content-Type'); if (contentType && contentType.includes('application/json')) { // 如果响应是JSON,则直接使用(此时data可能是字符串或对象,取决于jQuery版本和设置) // 为了保险,我们可以用typeof判断 if (typeof data === 'string') { try { data = JSON.parse(data); } catch (e) { // 处理解析错误 } } // 处理data对象 } else { // 非JSON响应,按文本处理 console.log('非JSON响应:', data); } }, error: function(xhr) { // 请求失败(如4xx, 5xx) console.error('请求失败', xhr.status); } }); ``` ### 总结 根据错误信息,最可能的原因是: - 服务器返回了非JSON格式的数据(比如错误信息、HTML页面等),而前端代码试图用`JSON.parse`去解析。 - 或者,在jQuery已经自动解析的情况下,又手动调用`JSON.parse`导致重复解析。 请按照上述步骤检查网络请求的响应内容和代码逻辑,然后进行修正。 ### 相关问题 1. 如何避免JavaScript中的JSON解析错误? 2. 使用jQuery的ajax方法时,如何正确处理JSON数据? 3. 服务器返回错误信息时,如何在前端优雅地处理? [^1]: 引用[1]中提到了在JavaScript中使用`JSON.parse`解析字符串时出现类似错误。 [^2]: 引用[2]指出当接收方对非JSON数据使用`JSON.parse`时会出现此错误。 [^4]: 引用[4]提供了一个实际案例:后端改变数据格式导致前端解析失败。 [^5]: 引用[5]展示了参数传递错误的代码示例。</think>### 分析解决 JSON 解析错误:`Unexpected non-whitespace character after JSON at position 54` #### 错误原因分析 该错误发生在 `guideCheck.js` 第 177 行的 `JSON.parse()` 方法中,核心问题是 **尝试解析无效的 JSON 字符串**。具体表现为: 1. **位置 54 存在非法字符**:在 JSON 字符串的第 54 个字符处(从 0 开始计数)出现不符合 JSON 规范的字符 2. **数据格式不匹配**:后端返回的数据不是有效的 JSON 格式(如 HTML、纯文本或格式错误的 JSON) 3. **常见触发场景**: - 后端意外更改数据格式(如从 JSON 改为纯文本)[^4] - 前端参数传递错误(如直接传递 `row.id` 而非对象格式)[^5] - JSON 字符串包含未转义的特殊字符(如换行符 `\n` 或额外逗号) #### 诊断步骤 1. **检查网络响应**: ```javascript // 在浏览器开发者工具的 Network 选项卡中: // 1. 找到触发错误的请求 // 2. 查看 Response 标签页 // 3. 检查 Content-Type 是否为 application/json // 4. 复制响应内容到 JSONLint 验证 ``` 2. **定位问题代码**: 在 `guideCheck.js` 中添加调试代码: ```javascript // 修改第 177 行附近代码 success: function(rawData) { console.log("原始数据:", rawData); // 输出原始响应 console.log("长度:", rawData.length); // 检查长度 try { const parsedData = JSON.parse(rawData); } catch (e) { console.error("解析失败:", e.message); console.log("问题位置:", rawData.slice(50, 60)); // 输出 50-60 位置的字符 } } ``` 3. **常见问题位置检查**: - 位置 54 附近是否有 `</html>`(表示返回 HTML 错误页) - 是否有未转义引号:`"name": "value"` 误写为 `"name": "value"` - 是否有多余逗号:`{"a":1,}`(尾部逗号不合法) #### 解决方案 ##### 方案 1:修复数据格式问题(推荐) ```javascript // 修改 ajax 请求配置 $.ajax({ url: '/your-api-endpoint', dataType: 'json', // 明确要求 JSON 格式 success: function(data) { // jQuery 会自动解析 JSON,无需手动 JSON.parse console.log(data); }, error: function(xhr) { console.error('请求失败:', xhr.responseText); } }); ``` **关键点**:设置 `dataType: 'json'` 后,jQuery 会自动处理解析,避免手动调用 `JSON.parse`[^4] ##### 方案 2:修复参数传递错误 ```javascript // 错误示例(直接传递原始值) deleteUser(row.id).then(...) // 正确示例(传递对象格式) deleteUser({ id: row.id }).then(...) // 确保参数为对象[^5] ``` ##### 方案 3:增强错误处理 ```javascript // 在解析处添加 try-catch try { const data = JSON.parse(rawData); } catch (e) { if (rawData.includes('<html>')) { console.error('后端返回 HTML 错误页'); } else { console.error('无效 JSON:', rawData); } } ``` ##### 方案 4:验证并清理数据 ```javascript function safeJsonParse(str) { try { // 移除可能存在的非法字符 const cleanStr = str .replace(/[\x00-\x1F]/g, '') // 移除控制字符 .replace(/,\s*]/g, ']') // 修复尾部逗号 .replace(/,\s*}/g, '}'); // 修复尾部逗号 return JSON.parse(cleanStr); } catch (e) { return null; // 或返回默认值 } } ``` #### 预防措施 1. **前后端约定数据规范**: - 使用 OpenAPI 规范定义接口 - 确保错误响应也返回 JSON 格式:`{"error": "message"}` 2. **添加内容类型检查**: ```javascript fetch('/api') .then(res => { const contentType = res.headers.get('content-type'); if (!contentType.includes('application/json')) { throw new Error("非 JSON 响应"); } return res.json(); }) ``` 3. **使用 JSON Schema 验证**: ```javascript import { validate } from 'jsonschema'; const schema = { type: 'object', properties: { id: { type: 'integer' } } }; const result = validate(parsedData, schema); if (!result.valid) console.error('数据格式错误'); ``` > **关键结论**:根据引用[4]的案例分析,此错误最常见原因是**后端意外更改数据格式**。请优先检查相关 API 是否仍返回 JSON 格式数据[^4]。 ### 相关问题 1. 如何调试前端与后端之间的数据格式不一致问题? 2. 在 JavaScript 中处理 JSON 数据的最佳实践有哪些? 3. jQuery AJAX 请求中常见的配置错误有哪些? [^1]: JavaScript 使用 `JSON.parse` 解析字符串时报错 [^2]: 接收方对非 JSON 数据使用 `JSON.parse` 导致错误 [^4]: 后端数据格式变更导致前端解析失败 [^5]: 参数传递格式错误引发后端返回非 JSON 数据
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农小易

你的鼓励将是我持续写作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值